mm/iob: add support of alloc with timeout iob_timedalloc()

Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
chao.an 2022-02-17 12:34:36 +08:00 committed by Alan Carvalho de Assis
parent 4824ea68a9
commit 0b18cfbd9a
2 changed files with 63 additions and 6 deletions

View File

@ -233,6 +233,23 @@ struct iob_userstats_s
void iob_initialize(void);
/****************************************************************************
* Name: iob_timedalloc
*
* Description:
* Allocate an I/O buffer by taking the buffer at the head of the free list.
* This wait will be terminated when the specified timeout expires.
*
* Input Parameters:
* throttled - An indication of the IOB allocation is "throttled"
* timeout - Timeout value in milliseconds.
* consumerid - id representing who is consuming the IOB
*
****************************************************************************/
FAR struct iob_s *iob_timedalloc(bool throttled, unsigned int timeout,
enum iob_user_e consumerid);
/****************************************************************************
* Name: iob_alloc
*

View File

@ -93,7 +93,7 @@ static FAR struct iob_s *iob_alloc_committed(enum iob_user_e consumerid)
*
****************************************************************************/
static FAR struct iob_s *iob_allocwait(bool throttled,
static FAR struct iob_s *iob_allocwait(bool throttled, unsigned int timeout,
enum iob_user_e consumerid)
{
FAR struct iob_s *iob;
@ -130,7 +130,27 @@ static FAR struct iob_s *iob_allocwait(bool throttled,
* list.
*/
ret = nxsem_wait_uninterruptible(sem);
if (timeout == UINT_MAX)
{
ret = nxsem_wait_uninterruptible(sem);
}
else
{
struct timespec abstime;
DEBUGVERIFY(clock_gettime(CLOCK_REALTIME, &abstime));
abstime.tv_sec += timeout / MSEC_PER_SEC;
abstime.tv_nsec += timeout % MSEC_PER_SEC * NSEC_PER_MSEC;
if (abstime.tv_nsec >= NSEC_PER_SEC)
{
abstime.tv_sec++;
abstime.tv_nsec -= NSEC_PER_SEC;
}
ret = nxsem_timedwait_uninterruptible(sem, &abstime);
}
if (ret >= 0)
{
/* When we wake up from wait successfully, an I/O buffer was
@ -180,18 +200,25 @@ static FAR struct iob_s *iob_allocwait(bool throttled,
****************************************************************************/
/****************************************************************************
* Name: iob_alloc
* Name: iob_timedalloc
*
* Description:
* Allocate an I/O buffer by taking the buffer at the head of the free list.
* This wait will be terminated when the specified timeout expires.
*
* Input Parameters:
* throttled - An indication of the IOB allocation is "throttled"
* timeout - Timeout value in milliseconds.
* consumerid - id representing who is consuming the IOB
*
****************************************************************************/
FAR struct iob_s *iob_alloc(bool throttled, enum iob_user_e consumerid)
FAR struct iob_s *iob_timedalloc(bool throttled, unsigned int timeout,
enum iob_user_e consumerid)
{
/* Were we called from the interrupt level? */
if (up_interrupt_context() || sched_idletask())
if (up_interrupt_context() || sched_idletask() || timeout == 0)
{
/* Yes, then try to allocate an I/O buffer without waiting */
@ -201,10 +228,23 @@ FAR struct iob_s *iob_alloc(bool throttled, enum iob_user_e consumerid)
{
/* Then allocate an I/O buffer, waiting as necessary */
return iob_allocwait(throttled, consumerid);
return iob_allocwait(throttled, timeout, consumerid);
}
}
/****************************************************************************
* Name: iob_alloc
*
* Description:
* Allocate an I/O buffer by taking the buffer at the head of the free list.
*
****************************************************************************/
FAR struct iob_s *iob_alloc(bool throttled, enum iob_user_e consumerid)
{
return iob_timedalloc(throttled, UINT_MAX, consumerid);
}
/****************************************************************************
* Name: iob_tryalloc
*