You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/05/04 13:20:13 UTC
[incubator-nuttx] 04/05: mqueue: Add
nxmq_open/nxmq_close/nxmq_unlink function
This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 929292f57b14bbf5544ce2d2b5f4cd603ddc2a1a
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon May 4 04:31:05 2020 +0800
mqueue: Add nxmq_open/nxmq_close/nxmq_unlink function
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
fs/mqueue/mq_close.c | 66 ++++++++++++++++++-------
fs/mqueue/mq_open.c | 128 ++++++++++++++++++++++++++++++++++---------------
fs/mqueue/mq_unlink.c | 66 ++++++++++++++++++-------
include/nuttx/mqueue.h | 87 +++++++++++++++++++++++++++++++++
4 files changed, 273 insertions(+), 74 deletions(-)
diff --git a/fs/mqueue/mq_close.c b/fs/mqueue/mq_close.c
index 63cc545..38ad44b 100644
--- a/fs/mqueue/mq_close.c
+++ b/fs/mqueue/mq_close.c
@@ -88,7 +88,7 @@ int nxmq_close_group(mqd_t mqdes, FAR struct task_group_s *group)
inode = msgq->inode;
DEBUGASSERT(inode->u.i_mqueue == msgq);
- /* Decrement the reference count on the inode, possibly freeing it */
+ /* Decrement the reference count on the inode, possibly free it */
mq_inode_release(inode);
}
@@ -100,6 +100,51 @@ int nxmq_close_group(mqd_t mqdes, FAR struct task_group_s *group)
}
/****************************************************************************
+ * Name: nxmq_close
+ *
+ * Description:
+ * This is an internal OS interface. It is functionally equivalent to
+ * mq_close() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_close() for a more complete description of the
+ * behavior of this function
+ *
+ * Input Parameters:
+ * mqdes - Message queue descriptor.
+ *
+ * Returned Value:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success. A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+int nxmq_close(mqd_t mqdes)
+{
+ FAR struct tcb_s *rtcb = (FAR struct tcb_s *)sched_self();
+ int ret;
+
+ /* Lock the scheduler to prevent any asynchronous task delete operation
+ * (unlikely).
+ */
+
+ sched_lock();
+
+ rtcb = (FAR struct tcb_s *)sched_self();
+ DEBUGASSERT(mqdes != NULL && rtcb != NULL && rtcb->group != NULL);
+
+ /* Then perform the close operation */
+
+ ret = nxmq_close_group(mqdes, rtcb->group);
+
+ sched_unlock();
+ return ret;
+}
+
+/****************************************************************************
* Name: mq_close
*
* Description:
@@ -129,30 +174,15 @@ int nxmq_close_group(mqd_t mqdes, FAR struct task_group_s *group)
int mq_close(mqd_t mqdes)
{
- FAR struct tcb_s *rtcb = (FAR struct tcb_s *)sched_self();
int ret;
- /* Lock the scheduler to prevent any asynchronous task delete operation
- * (unlikely).
- */
-
- sched_lock();
-
- rtcb = (FAR struct tcb_s *)sched_self();
- DEBUGASSERT(mqdes != NULL && rtcb != NULL && rtcb->group != NULL);
-
- /* Then perform the close operation */
-
- ret = nxmq_close_group(mqdes, rtcb->group);
-#if 0
- if (ret < 0) /* Currently, nxmq_close_group() only returns OK */
+ ret = nxmq_close(mqdes);
+ if (ret < 0)
{
set_errno(-ret);
ret = ERROR;
}
-#endif
- sched_unlock();
return ret;
}
diff --git a/fs/mqueue/mq_open.c b/fs/mqueue/mq_open.c
index 5b0263f..3de5f73 100644
--- a/fs/mqueue/mq_open.c
+++ b/fs/mqueue/mq_open.c
@@ -43,14 +43,18 @@
****************************************************************************/
/****************************************************************************
- * Name: mq_open
+ * Name: nxmq_open
*
* Description:
* This function establish a connection between a named message queue and
- * the calling task. After a successful call of mq_open(), the task can
- * reference the message queue using the address returned by the call. The
- * message queue remains usable until it is closed by a successful call to
- * mq_close().
+ * the calling task. This is an internal OS interface. It is functionally
+ * equivalent to mq_open() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_open() for a more complete description of the
+ * behavior of this function
*
* Input Parameters:
* mq_name - Name of the queue to open
@@ -65,30 +69,27 @@
* messages that may be placed in the message queue.
*
* Returned Value:
- * A message queue descriptor or (mqd_t)-1 (ERROR)
- *
- * Assumptions:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success, mqdes point to the new message queue descriptor.
+ * A negated errno value is returned on failure.
*
****************************************************************************/
-mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
+int nxmq_open(FAR const char *mq_name, int oflags, mode_t mode,
+ FAR struct mq_attr *attr, FAR mqd_t *mqdes)
{
FAR struct inode *inode;
FAR struct mqueue_inode_s *msgq;
struct inode_search_s desc;
char fullpath[MAX_MQUEUE_PATH];
- va_list ap;
- struct mq_attr *attr;
- mqd_t mqdes;
- mode_t mode;
- int errcode;
int ret;
/* Make sure that a non-NULL name is supplied */
if (mq_name == NULL || *mq_name == '\0')
{
- errcode = EINVAL;
+ ret = -EINVAL;
goto errout;
}
@@ -132,7 +133,7 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
if (!INODE_IS_MQUEUE(inode))
{
- errcode = ENXIO;
+ ret = -ENXIO;
goto errout_with_inode;
}
@@ -142,17 +143,17 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
{
- errcode = EEXIST;
+ ret = -EEXIST;
goto errout_with_inode;
}
/* Create a message queue descriptor for the current thread */
msgq = inode->u.i_mqueue;
- mqdes = nxmq_create_des(NULL, msgq, oflags);
- if (!mqdes)
+ *mqdes = nxmq_create_des(NULL, msgq, oflags);
+ if (!*mqdes)
{
- errcode = ENOMEM;
+ ret = -ENOMEM;
goto errout_with_inode;
}
}
@@ -164,25 +165,15 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
{
/* The mqueue does not exist and O_CREAT is not set */
- errcode = ENOENT;
+ ret = -ENOENT;
goto errout_with_lock;
}
- /* Create the mqueue. First we have to extract the additional
- * parameters from the variable argument list.
- */
-
- va_start(ap, oflags);
- mode = va_arg(ap, mode_t);
- attr = va_arg(ap, FAR struct mq_attr *);
- va_end(ap);
-
/* Create an inode in the pseudo-filesystem at this path */
ret = inode_semtake();
if (ret < 0)
{
- errcode = -ret;
goto errout_with_lock;
}
@@ -191,7 +182,6 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
if (ret < 0)
{
- errcode = -ret;
goto errout_with_lock;
}
@@ -202,16 +192,16 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
msgq = (FAR struct mqueue_inode_s *)nxmq_alloc_msgq(mode, attr);
if (!msgq)
{
- errcode = ENOSPC;
+ ret = -ENOSPC;
goto errout_with_inode;
}
/* Create a message queue descriptor for the TCB */
- mqdes = nxmq_create_des(NULL, msgq, oflags);
- if (!mqdes)
+ *mqdes = nxmq_create_des(NULL, msgq, oflags);
+ if (!*mqdes)
{
- errcode = ENOMEM;
+ ret = -ENOMEM;
goto errout_with_msgq;
}
@@ -228,7 +218,7 @@ mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
RELEASE_SEARCH(&desc);
sched_unlock();
- return mqdes;
+ return OK;
errout_with_msgq:
nxmq_free_msgq(msgq);
@@ -242,6 +232,66 @@ errout_with_lock:
sched_unlock();
errout:
- set_errno(errcode);
- return (mqd_t)ERROR;
+ return ret;
+}
+
+/****************************************************************************
+ * Name: mq_open
+ *
+ * Description:
+ * This function establish a connection between a named message queue and
+ * the calling task. After a successful call of mq_open(), the task can
+ * reference the message queue using the address returned by the call. The
+ * message queue remains usable until it is closed by a successful call to
+ * mq_close().
+ *
+ * Input Parameters:
+ * mq_name - Name of the queue to open
+ * oflags - open flags
+ * Optional parameters. When the O_CREAT flag is specified, two optional
+ * parameters are expected:
+ *
+ * 1. mode_t mode (ignored), and
+ * 2. struct mq_attr *attr. The mq_maxmsg attribute
+ * is used at the time that the message queue is
+ * created to determine the maximum number of
+ * messages that may be placed in the message queue.
+ *
+ * Returned Value:
+ * A message queue descriptor or (mqd_t)-1 (ERROR)
+ *
+ * Assumptions:
+ *
+ ****************************************************************************/
+
+mqd_t mq_open(FAR const char *mq_name, int oflags, ...)
+{
+ FAR struct mq_attr *attr = NULL;
+ mode_t mode = 0;
+ mqd_t mqdes;
+ va_list ap;
+ int ret;
+
+ /* Were we asked to create it? */
+
+ if ((oflags & O_CREAT) != 0)
+ {
+ /* We have to extract the additional
+ * parameters from the variable argument list.
+ */
+
+ va_start(ap, oflags);
+ mode = va_arg(ap, mode_t);
+ attr = va_arg(ap, FAR struct mq_attr *);
+ va_end(ap);
+ }
+
+ ret = nxmq_open(mq_name, oflags, mode, attr, &mqdes);
+ if (ret < 0)
+ {
+ set_errno(ret);
+ mqdes = (mqd_t)ERROR;
+ }
+
+ return mqdes;
}
diff --git a/fs/mqueue/mq_unlink.c b/fs/mqueue/mq_unlink.c
index a99e6f3..ebe93b6 100644
--- a/fs/mqueue/mq_unlink.c
+++ b/fs/mqueue/mq_unlink.c
@@ -40,30 +40,33 @@
****************************************************************************/
/****************************************************************************
- * Name: mq_unlink
+ * Name: nxmq_unlink
*
* Description:
- * This function removes the message queue named by "mq_name." If one
- * or more tasks have the message queue open when mq_unlink() is called,
- * removal of the message queue is postponed until all references to the
- * message queue have been closed.
+ * This is an internal OS interface. It is functionally equivalent to
+ * mq_unlink() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_unlink() for a more complete description of the
+ * behavior of this function
*
* Input Parameters:
* mq_name - Name of the message queue
*
* Returned Value:
- * None
- *
- * Assumptions:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success. A negated errno value is returned on failure.
*
****************************************************************************/
-int mq_unlink(FAR const char *mq_name)
+int nxmq_unlink(FAR const char *mq_name)
{
FAR struct inode *inode;
struct inode_search_s desc;
char fullpath[MAX_MQUEUE_PATH];
- int errcode;
int ret;
/* Get the full path to the message queue */
@@ -80,7 +83,6 @@ int mq_unlink(FAR const char *mq_name)
{
/* There is no inode that includes in this path */
- errcode = -ret;
goto errout_with_search;
}
@@ -93,7 +95,7 @@ int mq_unlink(FAR const char *mq_name)
if (!INODE_IS_MQUEUE(inode))
{
- errcode = ENXIO;
+ ret = -ENXIO;
goto errout_with_inode;
}
@@ -104,13 +106,12 @@ int mq_unlink(FAR const char *mq_name)
ret = inode_semtake();
if (ret < 0)
{
- errcode = -ret;
goto errout_with_inode;
}
if (inode->i_child != NULL)
{
- errcode = ENOTEMPTY;
+ ret = -ENOTEMPTY;
goto errout_with_semaphore;
}
@@ -127,7 +128,6 @@ int mq_unlink(FAR const char *mq_name)
*/
DEBUGASSERT(ret >= 0 || ret == -EBUSY);
- UNUSED(ret);
/* Now we do not release the reference count in the normal way (by calling
* inode release. Rather, we call mq_inode_release(). mq_inode_release
@@ -151,7 +151,39 @@ errout_with_inode:
errout_with_search:
RELEASE_SEARCH(&desc);
- set_errno(errcode);
sched_unlock();
- return ERROR;
+ return ret;
+}
+
+/****************************************************************************
+ * Name: mq_unlink
+ *
+ * Description:
+ * This function removes the message queue named by "mq_name." If one
+ * or more tasks have the message queue open when mq_unlink() is called,
+ * removal of the message queue is postponed until all references to the
+ * message queue have been closed.
+ *
+ * Input Parameters:
+ * mq_name - Name of the message queue
+ *
+ * Returned Value:
+ * None
+ *
+ * Assumptions:
+ *
+ ****************************************************************************/
+
+int mq_unlink(FAR const char *mq_name)
+{
+ int ret;
+
+ ret = nxmq_unlink(mq_name);
+ if (ret < 0)
+ {
+ set_errno(-ret);
+ ret = ERROR;
+ }
+
+ return ret;
}
diff --git a/include/nuttx/mqueue.h b/include/nuttx/mqueue.h
index 7cc8bcb..69389ee 100644
--- a/include/nuttx/mqueue.h
+++ b/include/nuttx/mqueue.h
@@ -152,6 +152,93 @@ struct timespec; /* Forward reference */
struct task_group_s; /* Forward reference */
/****************************************************************************
+ * Name: nxmq_open
+ *
+ * Description:
+ * This function establish a connection between a named message queue and
+ * the calling task. This is an internal OS interface. It is functionally
+ * equivalent to mq_open() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_open() for a more complete description of the
+ * behavior of this function
+ *
+ * Input Parameters:
+ * mq_name - Name of the queue to open
+ * oflags - open flags
+ * Optional parameters. When the O_CREAT flag is specified, two optional
+ * parameters are expected:
+ *
+ * 1. mode_t mode (ignored), and
+ * 2. struct mq_attr *attr. The mq_maxmsg attribute
+ * is used at the time that the message queue is
+ * created to determine the maximum number of
+ * messages that may be placed in the message queue.
+ *
+ * Returned Value:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success, mqdes point to the new message queue descriptor.
+ * A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+int nxmq_open(FAR const char *mq_name, int oflags, mode_t mode,
+ FAR struct mq_attr *attr, FAR mqd_t *mqdes);
+
+/****************************************************************************
+ * Name: nxmq_close
+ *
+ * Description:
+ * This is an internal OS interface. It is functionally equivalent to
+ * mq_close() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_close() for a more complete description of the
+ * behavior of this function
+ *
+ * Input Parameters:
+ * mqdes - Message queue descriptor.
+ *
+ * Returned Value:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success. A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+int nxmq_close(mqd_t mqdes);
+
+/****************************************************************************
+ * Name: nxmq_unlink
+ *
+ * Description:
+ * This is an internal OS interface. It is functionally equivalent to
+ * mq_unlink() except that:
+ *
+ * - It is not a cancellation point, and
+ * - It does not modify the errno value.
+ *
+ * See comments with mq_unlink() for a more complete description of the
+ * behavior of this function
+ *
+ * Input Parameters:
+ * mq_name - Name of the message queue
+ *
+ * Returned Value:
+ * This is an internal OS interface and should not be used by applications.
+ * It follows the NuttX internal error return policy: Zero (OK) is
+ * returned on success. A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+int nxmq_unlink(FAR const char *mq_name);
+
+/****************************************************************************
* Name: nxmq_send
*
* Description: