You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/02/17 14:55:36 UTC
[incubator-nuttx] branch master updated: mm/iob: add support of alloc with timeout iob_timedalloc()
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 0b18cfb mm/iob: add support of alloc with timeout iob_timedalloc()
0b18cfb is described below
commit 0b18cfbd9a1f9103c06c7c017d7eaabc9347ff4b
Author: chao.an <an...@xiaomi.com>
AuthorDate: Thu Feb 17 12:34:36 2022 +0800
mm/iob: add support of alloc with timeout iob_timedalloc()
Signed-off-by: chao.an <an...@xiaomi.com>
---
include/nuttx/mm/iob.h | 17 +++++++++++++++++
mm/iob/iob_alloc.c | 52 ++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 63 insertions(+), 6 deletions(-)
diff --git a/include/nuttx/mm/iob.h b/include/nuttx/mm/iob.h
index afd63c0..e64130d 100644
--- a/include/nuttx/mm/iob.h
+++ b/include/nuttx/mm/iob.h
@@ -234,6 +234,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
*
* Description:
diff --git a/mm/iob/iob_alloc.c b/mm/iob/iob_alloc.c
index c26269f..7df00e8 100644
--- a/mm/iob/iob_alloc.c
+++ b/mm/iob/iob_alloc.c
@@ -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,11 +228,24 @@ 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
*
* Description: