[rtems commit] posix: Simplify message queues

Sebastian Huber sebh at rtems.org
Mon May 2 10:07:47 UTC 2016


Module:    rtems
Branch:    master
Commit:    c8982e5f6a4857444676165deab1e08dc91a6847
Changeset: http://git.rtems.org/rtems/commit/?id=c8982e5f6a4857444676165deab1e08dc91a6847

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Apr 26 21:20:31 2016 +0200

posix: Simplify message queues

The mq_open() function returns a descriptor to a POSIX message queue
object identified by a name.  This is similar to sem_open().  In
contrast to the POSIX semaphore the POSIX message queues use a separate
object for the descriptor.  This extra object is superfluous, since the
object identifier can be used directly for this purpose, just like for
the semaphores.

Update #2702.
Update #2555.

---

 cpukit/libcsupport/include/rtems/libcsupport.h |   1 -
 cpukit/libcsupport/src/resource_snapshot.c     |   1 -
 cpukit/posix/include/rtems/posix/config.h      |  11 --
 cpukit/posix/include/rtems/posix/mqueue.h      |   7 +-
 cpukit/posix/include/rtems/posix/mqueueimpl.h  |  89 ++---------
 cpukit/posix/src/mqueue.c                      |  11 --
 cpukit/posix/src/mqueueclose.c                 |  62 +++-----
 cpukit/posix/src/mqueuedeletesupp.c            |  56 ++-----
 cpukit/posix/src/mqueuegetattr.c               |  60 +++-----
 cpukit/posix/src/mqueuenotify.c                |  78 ++++------
 cpukit/posix/src/mqueueopen.c                  | 204 +++++++++----------------
 cpukit/posix/src/mqueuerecvsupp.c              | 167 +++++++++-----------
 cpukit/posix/src/mqueuesendsupp.c              | 162 +++++++++-----------
 cpukit/posix/src/mqueuesetattr.c               |  66 ++++----
 cpukit/posix/src/mqueueunlink.c                |  11 +-
 cpukit/rtems/src/rtemsobjectgetapiclassname.c  |   1 -
 cpukit/sapi/include/confdefs.h                 |  39 +----
 cpukit/score/include/rtems/score/objectimpl.h  |   1 -
 testsuites/psxtests/psxconfig01/init.c         |   5 -
 testsuites/psxtests/psxmsgq04/init.c           |   1 -
 testsuites/psxtmtests/psxtmmq01/init.c         |   1 -
 testsuites/sptests/spthreadq01/init.c          |  16 +-
 22 files changed, 357 insertions(+), 693 deletions(-)

diff --git a/cpukit/libcsupport/include/rtems/libcsupport.h b/cpukit/libcsupport/include/rtems/libcsupport.h
index 1e16551..c0fab6b 100644
--- a/cpukit/libcsupport/include/rtems/libcsupport.h
+++ b/cpukit/libcsupport/include/rtems/libcsupport.h
@@ -114,7 +114,6 @@ typedef struct {
   uint32_t active_barriers;
   uint32_t active_condition_variables;
   uint32_t active_message_queues;
-  uint32_t active_message_queue_descriptors;
   uint32_t active_mutexes;
   uint32_t active_rwlocks;
   uint32_t active_semaphores;
diff --git a/cpukit/libcsupport/src/resource_snapshot.c b/cpukit/libcsupport/src/resource_snapshot.c
index 469df72..7f85d8d 100644
--- a/cpukit/libcsupport/src/resource_snapshot.c
+++ b/cpukit/libcsupport/src/resource_snapshot.c
@@ -70,7 +70,6 @@ static const Objects_Information *const objects_info_table[] = {
     &_POSIX_Barrier_Information,
     &_POSIX_Condition_variables_Information,
     &_POSIX_Message_queue_Information,
-    &_POSIX_Message_queue_Information_fds,
     &_POSIX_Mutex_Information,
     &_POSIX_RWLock_Information,
     &_POSIX_Semaphore_Information,
diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h
index 08d764b..636f1e7 100644
--- a/cpukit/posix/include/rtems/posix/config.h
+++ b/cpukit/posix/include/rtems/posix/config.h
@@ -94,17 +94,6 @@ typedef struct {
 
   /**
    * This field contains the maximum number of POSIX API
-   * message queue file descriptors which are configured
-   * for this application.
-   *
-   * @note There can be one or more file descriptors used with
-   *       each message queue. This value should be greater than
-   *       or equal to the number of message queues.
-   */
-  uint32_t                            maximum_message_queue_descriptors;
-
-  /**
-   * This field contains the maximum number of POSIX API
    * semaphores which are configured for this application.
    */
   uint32_t                            maximum_semaphores;
diff --git a/cpukit/posix/include/rtems/posix/mqueue.h b/cpukit/posix/include/rtems/posix/mqueue.h
index df9daff..cdf9451 100644
--- a/cpukit/posix/include/rtems/posix/mqueue.h
+++ b/cpukit/posix/include/rtems/posix/mqueue.h
@@ -58,14 +58,9 @@ typedef struct {
    bool                        linked;
    uint32_t                    open_count;
    struct sigevent             notification;
+   int                         oflag;
 }  POSIX_Message_queue_Control;
 
-typedef struct {
-   Objects_Control              Object;
-   POSIX_Message_queue_Control *Queue;
-   int                          oflag;
-} POSIX_Message_queue_Control_fd;
-
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/posix/include/rtems/posix/mqueueimpl.h b/cpukit/posix/include/rtems/posix/mqueueimpl.h
index 1cdf619..491f716 100644
--- a/cpukit/posix/include/rtems/posix/mqueueimpl.h
+++ b/cpukit/posix/include/rtems/posix/mqueueimpl.h
@@ -23,6 +23,8 @@
 #include <rtems/posix/posixapi.h>
 #include <rtems/score/coremsgimpl.h>
 
+#include <rtems/seterr.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -34,19 +36,14 @@ extern "C" {
 extern Objects_Information _POSIX_Message_queue_Information;
 
 /**
- *  The is used to manage the set of "file descriptors" associated with
- *  the message queues.
- */
-extern Objects_Information _POSIX_Message_queue_Information_fds;
-
-/**
  * @brief Delete a POSIX Message Queue
  *
  * This routine supports the mq_unlink and mq_close routines by
  * doing most of the work involved with removing a message queue.
  */
 void _POSIX_Message_queue_Delete(
-  POSIX_Message_queue_Control *the_mq
+  POSIX_Message_queue_Control *the_mq,
+  ISR_lock_Context            *lock_context
 );
 
 /*@
@@ -88,17 +85,11 @@ int _POSIX_Message_queue_Send_support(
   Watchdog_Interval   timeout
 );
 
-/**
- *  @brief POSIX Message Queue Allocate
- *
- *  This function allocates a message queue control block from
- *  the inactive chain of free message queue control blocks.
- */
-RTEMS_INLINE_ROUTINE
-  POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *
+  _POSIX_Message_queue_Allocate_unprotected( void )
 {
   return (POSIX_Message_queue_Control *)
-    _Objects_Allocate( &_POSIX_Message_queue_Information );
+    _Objects_Allocate_unprotected( &_POSIX_Message_queue_Information );
 }
 
 /**
@@ -115,24 +106,13 @@ RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free(
 }
 
 
-/**
- *  @brief POSIX Message Queue Get
- *
- *  This function maps message queue IDs to message queue control blocks.
- *  If ID corresponds to a local message queue, then it returns
- *  the_mq control pointer which maps to ID and location
- *  is set to OBJECTS_LOCAL.  if the message queue ID is global and
- *  resides on a remote node, then location is set to OBJECTS_REMOTE,
- *  and the_message queue is undefined.  Otherwise, location is set
- *  to OBJECTS_ERROR and the_mq is undefined.
- */
-RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
-  Objects_Id         id,
-  Objects_Locations *location
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get(
+  Objects_Id        id,
+  ISR_lock_Context *lock_context
 )
 {
   return (POSIX_Message_queue_Control *)
-    _Objects_Get( &_POSIX_Message_queue_Information, id, location );
+    _Objects_Get_local( id, &_POSIX_Message_queue_Information, lock_context );
 }
 
 /*
@@ -171,26 +151,6 @@ RTEMS_INLINE_ROUTINE unsigned int _POSIX_Message_queue_Priority_from_core(
 int _POSIX_Message_queue_Translate_core_message_queue_return_code(
   uint32_t   the_message_queue_status
 );
- 
-/**
- *  @brief POSIX Message Queue Allocate File Descriptor
- */
-RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
-  _POSIX_Message_queue_Allocate_fd( void )
-{
-  return (POSIX_Message_queue_Control_fd *)
-    _Objects_Allocate( &_POSIX_Message_queue_Information_fds );
-}
- 
-/**
- *  @brief POSIX Message Queue Free File Descriptor
- */
-RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
-  POSIX_Message_queue_Control_fd *the_mq_fd
-)
-{
-  _Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
-}
 
 /**
  *  @brief POSIX Message Queue Remove from Namespace
@@ -202,33 +162,16 @@ RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Namespace_remove (
   _Objects_Namespace_remove( 
     &_POSIX_Message_queue_Information, &the_mq->Object );
 }
- 
-/*
- *  @brief POSIX Message Queue Get File Descriptor
- */
-RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
-  mqd_t              id,
-  Objects_Locations *location
-)
-{
-  return (POSIX_Message_queue_Control_fd *) _Objects_Get(
-    &_POSIX_Message_queue_Information_fds,
-    (Objects_Id)id,
-    location
-  );
-}
 
-RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
-_POSIX_Message_queue_Get_fd_interrupt_disable(
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *
+_POSIX_Message_queue_Get_interrupt_disable(
   mqd_t              id,
-  Objects_Locations *location,
   ISR_lock_Context  *lock_context
 )
 {
-  return (POSIX_Message_queue_Control_fd *) _Objects_Get_isr_disable(
-    &_POSIX_Message_queue_Information_fds,
-    (Objects_Id)id,
-    location,
+  return (POSIX_Message_queue_Control *) _Objects_Get_local(
+    (Objects_Id) id,
+    &_POSIX_Message_queue_Information,
     lock_context
   );
 }
diff --git a/cpukit/posix/src/mqueue.c b/cpukit/posix/src/mqueue.c
index e5fc3a0..fca9929 100644
--- a/cpukit/posix/src/mqueue.c
+++ b/cpukit/posix/src/mqueue.c
@@ -61,17 +61,6 @@ static void _POSIX_Message_queue_Manager_initialization(void)
     _POSIX_PATH_MAX,            /* maximum length of each object's name */
     NULL                        /* Proxy extraction support callout */
   );
-  _Objects_Initialize_information(
-    &_POSIX_Message_queue_Information_fds,
-    OBJECTS_POSIX_API,
-    OBJECTS_POSIX_MESSAGE_QUEUE_FDS,
-    Configuration_POSIX_API.maximum_message_queue_descriptors,
-    sizeof( POSIX_Message_queue_Control_fd ),
-                                /* size of this object's control block */
-    true,                       /* true if names for this object are strings */
-    NAME_MAX,                   /* maximum length of each object's name */
-    NULL                        /* Proxy extraction support callout */
-  );
 }
 
 RTEMS_SYSINIT_ITEM(
diff --git a/cpukit/posix/src/mqueueclose.c b/cpukit/posix/src/mqueueclose.c
index 2864e95..28a7d16 100644
--- a/cpukit/posix/src/mqueueclose.c
+++ b/cpukit/posix/src/mqueueclose.c
@@ -30,17 +30,6 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
 /*
@@ -52,42 +41,31 @@ int mq_close(
   mqd_t  mqdes
 )
 {
-  POSIX_Message_queue_Control    *the_mq;
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  Objects_Locations               location;
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
 
   _Objects_Allocator_lock();
-  the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
-  if ( location == OBJECTS_LOCAL ) {
-      /* OBJECTS_LOCAL:
-       *
-       *  First update the actual message queue to reflect this descriptor
-       *  being disassociated.  This may result in the queue being really
-       *  deleted.
-       */
-
-      the_mq = the_mq_fd->Queue;
-      the_mq->open_count -= 1;
-      _POSIX_Message_queue_Delete( the_mq );
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
 
-      /*
-       *  Now close this file descriptor.
-       */
+  if ( the_mq == NULL ) {
+    _Objects_Allocator_unlock();
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-      _Objects_Close(
-        &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
-      _POSIX_Message_queue_Free_fd( the_mq_fd );
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
+    &lock_context
+  );
 
-      _Objects_Put( &the_mq_fd->Object );
-      _Objects_Allocator_unlock();
-      return 0;
-   }
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    _Objects_Allocator_unlock();
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-   _Objects_Allocator_unlock();
+  the_mq->open_count -= 1;
+  _POSIX_Message_queue_Delete( the_mq, &lock_context );
 
-   /*
-    *  OBJECTS_REMOTE:
-    *  OBJECTS_ERROR:
-    */
-   rtems_set_errno_and_return_minus_one( EBADF );
+  _Objects_Allocator_unlock();
+  return 0;
 }
diff --git a/cpukit/posix/src/mqueuedeletesupp.c b/cpukit/posix/src/mqueuedeletesupp.c
index 5382dd4..61f330a 100644
--- a/cpukit/posix/src/mqueuedeletesupp.c
+++ b/cpukit/posix/src/mqueuedeletesupp.c
@@ -18,56 +18,22 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
-#if defined(RTEMS_DEBUG)
-  #include <rtems/bspIo.h>
-#endif
 
 void _POSIX_Message_queue_Delete(
-  POSIX_Message_queue_Control *the_mq
+  POSIX_Message_queue_Control *the_mq,
+  ISR_lock_Context            *lock_context
 )
 {
-  if ( !the_mq->linked && !the_mq->open_count ) {
-      Objects_Control *the_object = &the_mq->Object;
-      ISR_lock_Context lock_context;
-
-      #if defined(RTEMS_DEBUG)
-        /*
-         *  the name memory will have been freed by unlink.
-         */
-	if ( the_object->name.name_p ) {
-          printk(
-            "POSIX MQ name (%p) not freed by unlink\n",
-	    (void *)the_object->name.name_p
-          );
-	  _Workspace_Free( (void *)the_object->name.name_p );
-        }
-      #endif
-
-      _CORE_message_queue_Acquire( &the_mq->Message_queue, &lock_context );
-
-      _Objects_Close( &_POSIX_Message_queue_Information, the_object );
-
-      _CORE_message_queue_Close(
-        &the_mq->Message_queue,
-        NULL,        /* no MP support */
-        0,
-        &lock_context
-      );
-
+  if ( !the_mq->linked && the_mq->open_count == 0 ) {
+    _CORE_message_queue_Close(
+      &the_mq->Message_queue,
+      NULL,        /* no MP support */
+      0,
+      lock_context
+    );
     _POSIX_Message_queue_Free( the_mq );
-
+  } else {
+    _CORE_message_queue_Release( &the_mq->Message_queue, lock_context );
   }
 }
diff --git a/cpukit/posix/src/mqueuegetattr.c b/cpukit/posix/src/mqueuegetattr.c
index 735bb12..dae14e3 100644
--- a/cpukit/posix/src/mqueuegetattr.c
+++ b/cpukit/posix/src/mqueuegetattr.c
@@ -30,17 +30,6 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
 /*
@@ -52,36 +41,37 @@ int mq_getattr(
   struct mq_attr *mqstat
 )
 {
-  POSIX_Message_queue_Control          *the_mq;
-  POSIX_Message_queue_Control_fd       *the_mq_fd;
-  Objects_Locations                     location;
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
 
-  if ( !mqstat )
+  if ( mqstat == NULL ) {
     rtems_set_errno_and_return_minus_one( EINVAL );
+  }
 
-  the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
-  switch ( location ) {
-
-    case OBJECTS_LOCAL:
-      the_mq = the_mq_fd->Queue;
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
 
-      /*
-       *  Return the old values.
-       */
-      mqstat->mq_flags   = the_mq_fd->oflag;
-      mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
-      mqstat->mq_maxmsg  = the_mq->Message_queue.maximum_pending_messages;
-      mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+  if ( the_mq == NULL ) {
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-      _Objects_Put( &the_mq_fd->Object );
-      return 0;
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
+    &lock_context
+  );
 
-#if defined(RTEMS_MULTIPROCESSING)
-    case OBJECTS_REMOTE:
-#endif
-    case OBJECTS_ERROR:
-      break;
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
   }
 
-  rtems_set_errno_and_return_minus_one( EBADF );
+  /*
+   *  Return the old values.
+   */
+  mqstat->mq_flags   = the_mq->oflag;
+  mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+  mqstat->mq_maxmsg  = the_mq->Message_queue.maximum_pending_messages;
+  mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+
+  _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+  return 0;
 }
diff --git a/cpukit/posix/src/mqueuenotify.c b/cpukit/posix/src/mqueuenotify.c
index d31a8e6..adcfdcb 100644
--- a/cpukit/posix/src/mqueuenotify.c
+++ b/cpukit/posix/src/mqueuenotify.c
@@ -18,25 +18,9 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-#include <sys/types.h>
-#include <signal.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
-/*
- *  _POSIX_Message_queue_Notify_handler
- *
- */
+#include <signal.h>
 
 static void _POSIX_Message_queue_Notify_handler(
   CORE_message_queue_Control *the_message_queue,
@@ -64,45 +48,41 @@ int mq_notify(
   const struct sigevent *notification
 )
 {
-  POSIX_Message_queue_Control    *the_mq;
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  Objects_Locations               location;
-
-  the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
-  switch ( location ) {
-
-    case OBJECTS_LOCAL:
-      the_mq = the_mq_fd->Queue;
-
-      if ( notification ) {
-        if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) {
-          _Objects_Put( &the_mq_fd->Object );
-          rtems_set_errno_and_return_minus_one( EBUSY );
-        }
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
 
-        _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL );
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
 
-        the_mq->notification = *notification;
+  if ( the_mq == NULL ) {
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-        _CORE_message_queue_Set_notify(
-          &the_mq->Message_queue,
-          _POSIX_Message_queue_Notify_handler
-        );
-      } else {
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
+    &lock_context
+  );
 
-        _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL );
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-      }
+  if ( notification != NULL ) {
+    if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) {
+      _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+      rtems_set_errno_and_return_minus_one( EBUSY );
+    }
 
-      _Objects_Put( &the_mq_fd->Object );
-      return 0;
+    the_mq->notification = *notification;
 
-#if defined(RTEMS_MULTIPROCESSING)
-    case OBJECTS_REMOTE:
-#endif
-    case OBJECTS_ERROR:
-      break;
+    _CORE_message_queue_Set_notify(
+      &the_mq->Message_queue,
+      _POSIX_Message_queue_Notify_handler
+    );
+  } else {
+    _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL );
   }
 
-  rtems_set_errno_and_return_minus_one( EBADF );
+  _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+  return 0;
 }
diff --git a/cpukit/posix/src/mqueueopen.c b/cpukit/posix/src/mqueueopen.c
index 973c9b8..fe63d4e 100644
--- a/cpukit/posix/src/mqueueopen.c
+++ b/cpukit/posix/src/mqueueopen.c
@@ -30,59 +30,48 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
+#include <rtems/posix/mqueueimpl.h>
+#include <rtems/score/wkspace.h>
 
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
+#include <stdarg.h>
 #include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/score/todimpl.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/posix/mqueueimpl.h>
-#include <rtems/seterr.h>
 
 #define MQ_OPEN_FAILED ((mqd_t) -1)
 
-static int _POSIX_Message_queue_Create_support(
-  const char                    *name_arg,
-  size_t                         name_len,
-  struct mq_attr                *attr_ptr,
-  POSIX_Message_queue_Control  **message_queue
+/*
+ *  There is no real basis for the default values.  They will work
+ *  but were not compared against any existing implementation for
+ *  compatibility.  See README.mqueue for an example program we
+ *  think will print out the defaults.  Report anything you find with it.
+ */
+static const struct mq_attr _POSIX_Message_queue_Default_attributes = {
+  .mq_maxmsg = 10,
+  .mq_msgsize = 16
+};
+
+static mqd_t _POSIX_Message_queue_Create(
+  const char           *name_arg,
+  size_t                name_len,
+  int                   oflag,
+  const struct mq_attr *attr
 )
 {
-  POSIX_Message_queue_Control   *the_mq;
-  struct mq_attr                 attr;
-  char                          *name;
+  POSIX_Message_queue_Control  *the_mq;
+  char                         *name;
 
   /* length of name has already been validated */
 
-  /*
-   *  There is no real basis for the default values.  They will work
-   *  but were not compared against any existing implementation for
-   *  compatibility.  See README.mqueue for an example program we
-   *  think will print out the defaults.  Report anything you find with it.
-   */
-  if ( attr_ptr == NULL ) {
-    attr.mq_maxmsg  = 10;
-    attr.mq_msgsize = 16;
-  } else {
-    if ( attr_ptr->mq_maxmsg <= 0 ){
-      rtems_set_errno_and_return_minus_one( EINVAL );
-    }
-
-    if ( attr_ptr->mq_msgsize <= 0 ){
-      rtems_set_errno_and_return_minus_one( EINVAL );
-    }
+  if ( attr->mq_maxmsg <= 0 ){
+    rtems_set_errno_and_return_value( EINVAL, MQ_OPEN_FAILED );
+  }
 
-    attr = *attr_ptr;
+  if ( attr->mq_msgsize <= 0 ){
+    rtems_set_errno_and_return_value( EINVAL, MQ_OPEN_FAILED );
   }
 
-  the_mq = _POSIX_Message_queue_Allocate();
+  the_mq = _POSIX_Message_queue_Allocate_unprotected();
   if ( !the_mq ) {
-    _Objects_Allocator_unlock();
-    rtems_set_errno_and_return_minus_one( ENFILE );
+    rtems_set_errno_and_return_value( ENFILE, MQ_OPEN_FAILED );
   }
 
   /*
@@ -92,12 +81,12 @@ static int _POSIX_Message_queue_Create_support(
   name = _Workspace_String_duplicate( name_arg, name_len );
   if ( !name ) {
     _POSIX_Message_queue_Free( the_mq );
-    _Objects_Allocator_unlock();
-    rtems_set_errno_and_return_minus_one( ENOMEM );
+    rtems_set_errno_and_return_value( ENOMEM, MQ_OPEN_FAILED );
   }
 
   the_mq->open_count = 1;
   the_mq->linked = true;
+  the_mq->oflag = oflag;
 
   /*
    *  NOTE: That thread blocking discipline should be based on the
@@ -106,17 +95,17 @@ static int _POSIX_Message_queue_Create_support(
    *  Joel: Cite POSIX or OpenGroup on above statement so we can determine
    *        if it is a real requirement.
    */
-  if ( !_CORE_message_queue_Initialize(
-           &the_mq->Message_queue,
-           CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
-           attr.mq_maxmsg,
-           attr.mq_msgsize
-      ) ) {
-
+  if (
+    !_CORE_message_queue_Initialize(
+      &the_mq->Message_queue,
+      CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
+      attr->mq_maxmsg,
+      attr->mq_msgsize
+    )
+  ) {
     _POSIX_Message_queue_Free( the_mq );
-    _Workspace_Free(name);
-    _Objects_Allocator_unlock();
-    rtems_set_errno_and_return_minus_one( ENOSPC );
+    _Workspace_Free( name );
+    rtems_set_errno_and_return_value( ENOSPC, MQ_OPEN_FAILED );
   }
 
   _Objects_Open_string(
@@ -124,11 +113,7 @@ static int _POSIX_Message_queue_Create_support(
     &the_mq->Object,
     name
   );
-
-  *message_queue = the_mq;
-
-  _Objects_Allocator_unlock();
-  return 0;
+  return the_mq->Object.id;
 }
 
 /*
@@ -142,36 +127,12 @@ mqd_t mq_open(
   /* struct mq_attr  attr */
 )
 {
-  /*
-   * mode is set but never used. GCC gives a warning for this
-   * and we need to tell GCC not to complain. But we have to
-   * have it because we have to work through the variable
-   * arguments to get to attr.
-   */
-  mode_t                          mode RTEMS_UNUSED;
-
-  va_list                         arg;
-  struct mq_attr                 *attr = NULL;
-  int                             status;
-  POSIX_Message_queue_Control    *the_mq;
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  size_t                          name_len;
-  Objects_Get_by_name_error       error;
-
-  if ( oflag & O_CREAT ) {
-    va_start(arg, oflag);
-    mode = va_arg( arg, mode_t );
-    attr = va_arg( arg, struct mq_attr * );
-    va_end(arg);
-  }
-
-  the_mq_fd = _POSIX_Message_queue_Allocate_fd();
-  if ( !the_mq_fd ) {
-    _Objects_Allocator_unlock();
-    rtems_set_errno_and_return_value( ENFILE, MQ_OPEN_FAILED );
-  }
-  the_mq_fd->oflag = oflag;
+  POSIX_Message_queue_Control *the_mq;
+  size_t                       name_len;
+  Objects_Get_by_name_error    error;
+  mqd_t                        status;
 
+  _Objects_Allocator_lock();
   the_mq = _POSIX_Message_queue_Get_by_name( name, &name_len, &error );
 
   /*
@@ -181,12 +142,15 @@ mqd_t mq_open(
    *  or some other miscellaneous error on the name.
    */
   if ( the_mq == NULL ) {
+    va_list               ap;
+    const struct mq_attr *attr;
+
     /*
      * Unless provided a valid name that did not already exist
      * and we are willing to create then it is an error.
      */
-    if ( !( error == OBJECTS_GET_BY_NAME_NO_OBJECT && (oflag & O_CREAT) ) ) {
-      _POSIX_Message_queue_Free_fd( the_mq_fd );
+
+    if ( error != OBJECTS_GET_BY_NAME_NO_OBJECT || ( oflag & O_CREAT ) == 0 ) {
       _Objects_Allocator_unlock();
       rtems_set_errno_and_return_value(
         _POSIX_Get_by_name_error( error ),
@@ -194,60 +158,36 @@ mqd_t mq_open(
       );
     }
 
-  } else {                /* name -> ID translation succeeded */
+    va_start( ap, oflag );
+    va_arg( ap, mode_t );
+    attr = va_arg( ap, const struct mq_attr * );
+    va_end( ap );
+
+    if ( attr == NULL ) {
+      attr = &_POSIX_Message_queue_Default_attributes;
+    }
+
+    /*
+     *  At this point, the message queue does not exist and everything has been
+     *  checked. We should go ahead and create a message queue.
+     */
+
+    status = _POSIX_Message_queue_Create( name, name_len, oflag, attr );
+  } else {
+
     /*
      * Check for existence with creation.
      */
-    if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
-      _POSIX_Message_queue_Free_fd( the_mq_fd );
+
+    if ( ( oflag & ( O_CREAT | O_EXCL ) ) == ( O_CREAT | O_EXCL ) ) {
       _Objects_Allocator_unlock();
       rtems_set_errno_and_return_value( EEXIST, MQ_OPEN_FAILED );
     }
 
-    /*
-     * In this case we need to do an ID->pointer conversion to
-     * check the mode.
-     */
     the_mq->open_count += 1;
-    the_mq_fd->Queue = the_mq;
-    _Objects_Open_string(
-      &_POSIX_Message_queue_Information_fds,
-      &the_mq_fd->Object,
-      NULL
-    );
-    _Objects_Allocator_unlock();
-    return the_mq_fd->Object.id;
-
+    status = the_mq->Object.id;
   }
 
-  /*
-   *  At this point, the message queue does not exist and everything has been
-   *  checked. We should go ahead and create a message queue.
-   */
-  status = _POSIX_Message_queue_Create_support(
-    name,
-    name_len,
-    attr,
-    &the_mq
-  );
-
-  /*
-   * errno was set by Create_support, so don't set it again.
-   */
-  if ( status != 0 ) {
-    _POSIX_Message_queue_Free_fd( the_mq_fd );
-    _Objects_Allocator_unlock();
-    return MQ_OPEN_FAILED;
-  }
-
-  the_mq_fd->Queue = the_mq;
-  _Objects_Open_string(
-    &_POSIX_Message_queue_Information_fds,
-    &the_mq_fd->Object,
-    NULL
-  );
-
   _Objects_Allocator_unlock();
-
-  return the_mq_fd->Object.id;
+  return status;
 }
diff --git a/cpukit/posix/src/mqueuerecvsupp.c b/cpukit/posix/src/mqueuerecvsupp.c
index ecdadb3..b1d830e 100644
--- a/cpukit/posix/src/mqueuerecvsupp.c
+++ b/cpukit/posix/src/mqueuerecvsupp.c
@@ -18,19 +18,10 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
+#include <rtems/posix/mqueueimpl.h>
+#include <rtems/score/threadimpl.h>
 
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
 #include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/score/threadimpl.h>
-#include <rtems/seterr.h>
-#include <rtems/posix/mqueueimpl.h>
 
 THREAD_WAIT_QUEUE_OBJECT_ASSERT(
   POSIX_Message_queue_Control,
@@ -53,90 +44,82 @@ ssize_t _POSIX_Message_queue_Receive_support(
   Watchdog_Interval   timeout
 )
 {
-  POSIX_Message_queue_Control     *the_mq;
-  POSIX_Message_queue_Control_fd  *the_mq_fd;
-  Objects_Locations                location;
-  size_t                           length_out;
-  bool                             do_wait;
-  Thread_Control                  *executing;
-  ISR_lock_Context                 lock_context;
-
-  the_mq_fd = _POSIX_Message_queue_Get_fd_interrupt_disable(
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
+  size_t                       length_out;
+  bool                         do_wait;
+  Thread_Control              *executing;
+
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
+
+  if ( the_mq == NULL ) {
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  if ( ( the_mq->oflag & O_ACCMODE ) == O_WRONLY ) {
+    _ISR_lock_ISR_enable( &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
+    _ISR_lock_ISR_enable( &lock_context );
+    rtems_set_errno_and_return_minus_one( EMSGSIZE );
+  }
+
+  /*
+   *  Now if something goes wrong, we return a "length" of -1
+   *  to indicate an error.
+   */
+
+  length_out = -1;
+
+  /*
+   *  A timed receive with a bad time will do a poll regardless.
+   */
+  if ( wait ) {
+    do_wait = ( the_mq->oflag & O_NONBLOCK ) == 0;
+  } else {
+    do_wait = wait;
+  }
+
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
+    &lock_context
+  );
+
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  /*
+   *  Now perform the actual message receive
+   */
+  executing = _Thread_Executing;
+  _CORE_message_queue_Seize(
+    &the_mq->Message_queue,
+    executing,
     mqdes,
-    &location,
+    msg_ptr,
+    &length_out,
+    do_wait,
+    timeout,
     &lock_context
   );
-  switch ( location ) {
-
-    case OBJECTS_LOCAL:
-      if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
-        _ISR_lock_ISR_enable( &lock_context );
-        rtems_set_errno_and_return_minus_one( EBADF );
-      }
-
-      the_mq = the_mq_fd->Queue;
-
-      if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
-        _ISR_lock_ISR_enable( &lock_context );
-        rtems_set_errno_and_return_minus_one( EMSGSIZE );
-      }
-
-      /*
-       *  Now if something goes wrong, we return a "length" of -1
-       *  to indicate an error.
-       */
-
-      length_out = -1;
-
-      /*
-       *  A timed receive with a bad time will do a poll regardless.
-       */
-      if ( wait )
-        do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
-      else
-        do_wait = wait;
-
-      _CORE_message_queue_Acquire_critical(
-        &the_mq->Message_queue,
-        &lock_context
-      );
-
-      /*
-       *  Now perform the actual message receive
-       */
-      executing = _Thread_Executing;
-      _CORE_message_queue_Seize(
-        &the_mq->Message_queue,
-        executing,
-        mqdes,
-        msg_ptr,
-        &length_out,
-        do_wait,
-        timeout,
-        &lock_context
-      );
-
-      if (msg_prio) {
-        *msg_prio = _POSIX_Message_queue_Priority_from_core(
-             executing->Wait.count
-          );
-      }
-
-      if ( !executing->Wait.return_code )
-        return length_out;
-
-      rtems_set_errno_and_return_minus_one(
-        _POSIX_Message_queue_Translate_core_message_queue_return_code(
-          executing->Wait.return_code
-        )
-      );
-
-#if defined(RTEMS_MULTIPROCESSING)
-    case OBJECTS_REMOTE:
-#endif
-    case OBJECTS_ERROR:
-      break;
+
+  if ( msg_prio != NULL ) {
+    *msg_prio = _POSIX_Message_queue_Priority_from_core(
+      executing->Wait.count
+    );
+  }
+
+  if ( executing->Wait.return_code != CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL ) {
+    rtems_set_errno_and_return_minus_one(
+      _POSIX_Message_queue_Translate_core_message_queue_return_code(
+        executing->Wait.return_code
+      )
+    );
   }
 
-  rtems_set_errno_and_return_minus_one( EBADF );
+  return length_out;
 }
diff --git a/cpukit/posix/src/mqueuesendsupp.c b/cpukit/posix/src/mqueuesendsupp.c
index ade92b0..0d9974a 100644
--- a/cpukit/posix/src/mqueuesendsupp.c
+++ b/cpukit/posix/src/mqueuesendsupp.c
@@ -30,23 +30,9 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
-
-/*
- *  _POSIX_Message_queue_Send_support
- */
+#include <fcntl.h>
 
 int _POSIX_Message_queue_Send_support(
   mqd_t               mqdes,
@@ -57,92 +43,86 @@ int _POSIX_Message_queue_Send_support(
   Watchdog_Interval   timeout
 )
 {
-  POSIX_Message_queue_Control    *the_mq;
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  Objects_Locations               location;
-  CORE_message_queue_Status       msg_status;
-  bool                            do_wait;
-  Thread_Control                 *executing;
-  ISR_lock_Context                lock_context;
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
+  CORE_message_queue_Status    msg_status;
+  bool                         do_wait;
+  Thread_Control              *executing;
 
   /*
    * Validate the priority.
    * XXX - Do not validate msg_prio is not less than 0.
    */
 
-  if ( msg_prio > MQ_PRIO_MAX )
+  if ( msg_prio > MQ_PRIO_MAX ) {
     rtems_set_errno_and_return_minus_one( EINVAL );
+  }
 
-  the_mq_fd = _POSIX_Message_queue_Get_fd_interrupt_disable(
-    mqdes,
-    &location,
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
+
+  if ( the_mq == NULL ) {
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  if ( ( the_mq->oflag & O_ACCMODE ) == O_RDONLY ) {
+    _ISR_lock_ISR_enable( &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  /*
+   *  A timed receive with a bad time will do a poll regardless.
+   */
+  if ( wait ) {
+    do_wait = ( the_mq->oflag & O_NONBLOCK ) == 0;
+  } else {
+    do_wait = wait;
+  }
+
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
     &lock_context
   );
-  switch ( location ) {
-
-    case OBJECTS_LOCAL:
-      if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
-        _ISR_lock_ISR_enable( &lock_context );
-        rtems_set_errno_and_return_minus_one( EBADF );
-      }
-
-      the_mq = the_mq_fd->Queue;
-
-      /*
-       *  A timed receive with a bad time will do a poll regardless.
-       */
-      if ( wait )
-        do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
-      else
-        do_wait = wait;
-
-      _CORE_message_queue_Acquire_critical(
-        &the_mq->Message_queue,
-        &lock_context
-      );
-
-      /*
-       *  Now perform the actual message receive
-       */
-      executing = _Thread_Executing;
-      msg_status = _CORE_message_queue_Submit(
-        &the_mq->Message_queue,
-        executing,
-        msg_ptr,
-        msg_len,
-        NULL,
-        0,
-        _POSIX_Message_queue_Priority_to_core( msg_prio ),
-        do_wait,
-        timeout,   /* no timeout */
-        &lock_context
-      );
-
-      /*
-       *  If we had to block, then this is where the task returns
-       *  after it wakes up.  The returned status is correct for
-       *  non-blocking operations but if we blocked, then we need
-       *  to look at the status in our TCB.
-       */
-
-      if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
-        msg_status = executing->Wait.return_code;
-
-      if ( !msg_status )
-        return msg_status;
-
-      rtems_set_errno_and_return_minus_one(
-        _POSIX_Message_queue_Translate_core_message_queue_return_code(
-          msg_status
-        )
-      );
-
-#if defined(RTEMS_MULTIPROCESSING)
-    case OBJECTS_REMOTE:
-#endif
-    case OBJECTS_ERROR:
-      break;
+
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
+
+  /*
+   *  Now perform the actual message receive
+   */
+  executing = _Thread_Executing;
+  msg_status = _CORE_message_queue_Submit(
+    &the_mq->Message_queue,
+    executing,
+    msg_ptr,
+    msg_len,
+    NULL,
+    0,
+    _POSIX_Message_queue_Priority_to_core( msg_prio ),
+    do_wait,
+    timeout,
+    &lock_context
+  );
+
+  /*
+   *  If we had to block, then this is where the task returns
+   *  after it wakes up.  The returned status is correct for
+   *  non-blocking operations but if we blocked, then we need
+   *  to look at the status in our TCB.
+   */
+
+  if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT ) {
+    msg_status = executing->Wait.return_code;
+  }
+
+  if ( msg_status != CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL ) {
+    rtems_set_errno_and_return_minus_one(
+      _POSIX_Message_queue_Translate_core_message_queue_return_code(
+        msg_status
+      )
+    );
   }
 
-  rtems_set_errno_and_return_minus_one( EBADF );
+  return 0;
 }
diff --git a/cpukit/posix/src/mqueuesetattr.c b/cpukit/posix/src/mqueuesetattr.c
index 13e6974..dfd9bab 100644
--- a/cpukit/posix/src/mqueuesetattr.c
+++ b/cpukit/posix/src/mqueuesetattr.c
@@ -18,17 +18,6 @@
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-
-#include <rtems/system.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
 int mq_setattr(
@@ -37,41 +26,42 @@ int mq_setattr(
   struct mq_attr       *__restrict omqstat
 )
 {
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  CORE_message_queue_Control     *the_core_mq;
-  Objects_Locations               location;
+  POSIX_Message_queue_Control *the_mq;
+  ISR_lock_Context             lock_context;
 
-  if ( !mqstat )
+  if ( mqstat == NULL ) {
     rtems_set_errno_and_return_minus_one( EINVAL );
+  }
 
-  the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
-  switch ( location ) {
-
-    case OBJECTS_LOCAL:
+  the_mq = _POSIX_Message_queue_Get( mqdes, &lock_context );
 
-      the_core_mq = &the_mq_fd->Queue->Message_queue;
+  if ( the_mq == NULL ) {
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-      /*
-       *  Return the old values.
-       */
+  _CORE_message_queue_Acquire_critical(
+    &the_mq->Message_queue,
+    &lock_context
+  );
 
-      if ( omqstat ) {
-        omqstat->mq_flags   = the_mq_fd->oflag;
-        omqstat->mq_msgsize = the_core_mq->maximum_message_size;
-        omqstat->mq_maxmsg  = the_core_mq->maximum_pending_messages;
-        omqstat->mq_curmsgs = the_core_mq->number_of_pending_messages;
-      }
+  if ( the_mq->open_count == 0 ) {
+    _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+    rtems_set_errno_and_return_minus_one( EBADF );
+  }
 
-      the_mq_fd->oflag = mqstat->mq_flags;
-      _Objects_Put( &the_mq_fd->Object );
-      return 0;
+  /*
+   *  Return the old values.
+   */
 
-#if defined(RTEMS_MULTIPROCESSING)
-    case OBJECTS_REMOTE:
-#endif
-    case OBJECTS_ERROR:
-      break;
+  if ( omqstat != NULL ) {
+    omqstat->mq_flags   = the_mq->oflag;
+    omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+    omqstat->mq_maxmsg  = the_mq->Message_queue.maximum_pending_messages;
+    omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
   }
 
-  rtems_set_errno_and_return_minus_one( EBADF );
+  the_mq->oflag = mqstat->mq_flags;
+
+  _CORE_message_queue_Release( &the_mq->Message_queue, &lock_context );
+  return 0;
 }
diff --git a/cpukit/posix/src/mqueueunlink.c b/cpukit/posix/src/mqueueunlink.c
index d5182d2..dc485ba 100644
--- a/cpukit/posix/src/mqueueunlink.c
+++ b/cpukit/posix/src/mqueueunlink.c
@@ -18,10 +18,7 @@
 #include "config.h"
 #endif
 
-#include <mqueue.h>
-
 #include <rtems/posix/mqueueimpl.h>
-#include <rtems/seterr.h>
 
 /*
  *  15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
@@ -33,6 +30,7 @@ int mq_unlink(
 {
   POSIX_Message_queue_Control *the_mq;
   Objects_Get_by_name_error    error;
+  ISR_lock_Context             lock_context;
 
   _Objects_Allocator_lock();
 
@@ -42,9 +40,12 @@ int mq_unlink(
     rtems_set_errno_and_return_minus_one( _POSIX_Get_by_name_error( error ) );
   }
 
-  the_mq->linked = false;
   _POSIX_Message_queue_Namespace_remove( the_mq );
-  _POSIX_Message_queue_Delete( the_mq );
+
+  _CORE_message_queue_Acquire( &the_mq->Message_queue, &lock_context );
+
+  the_mq->linked = false;
+  _POSIX_Message_queue_Delete( the_mq, &lock_context );
 
   _Objects_Allocator_unlock();
   return 0;
diff --git a/cpukit/rtems/src/rtemsobjectgetapiclassname.c b/cpukit/rtems/src/rtemsobjectgetapiclassname.c
index c20413d..dd92e6c 100644
--- a/cpukit/rtems/src/rtemsobjectgetapiclassname.c
+++ b/cpukit/rtems/src/rtemsobjectgetapiclassname.c
@@ -48,7 +48,6 @@ static const rtems_assoc_t rtems_object_api_posix_assoc[] = {
   { "Thread",                  OBJECTS_POSIX_THREADS, 0},
   { "Key",                     OBJECTS_POSIX_KEYS, 0},
   { "Interrupt",               OBJECTS_POSIX_INTERRUPTS, 0},
-  { "Queued fd",               OBJECTS_POSIX_MESSAGE_QUEUE_FDS, 0},
   { "Message Queue",           OBJECTS_POSIX_MESSAGE_QUEUES, 0},
   { "Mutex",                   OBJECTS_POSIX_MUTEXES, 0},
   { "Semaphore",               OBJECTS_POSIX_SEMAPHORES, 0},
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index e0b2a80..006cdbd 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -2029,10 +2029,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
       #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES \
         rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
     #endif
-    #if !defined(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS)
-      #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS \
-        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
-    #endif
     #if !defined(CONFIGURE_MAXIMUM_POSIX_SEMAPHORES)
       #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES \
         rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
@@ -2582,17 +2578,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
   #endif
 
   /**
-   * This configuration parameter specifies the maximum number of
-   * POSIX API messages queue descriptors.
-   *
-   * This defaults to the number of POSIX API message queues.
-   */
-  #ifndef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS
-     #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS \
-             CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
-  #endif
-
-  /**
    * This macro is calculated to specify the memory required for
    * POSIX API message queues.
    *
@@ -2603,16 +2588,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
        _message_queues, sizeof(POSIX_Message_queue_Control) )
 
   /**
-   * This macro is calculated to specify the memory required for
-   * POSIX API message queue descriptors.
-   *
-   * This is an internal parameter.
-   */
-  #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS(_mqueue_fds) \
-    _Configure_Object_RAM( \
-       _mqueue_fds, sizeof(POSIX_Message_queue_Control_fd) )
-
-  /**
    * This configuration parameter specifies the maximum number of
    * POSIX API semaphores.
    */
@@ -2907,8 +2882,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
         CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS) + \
       CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
         CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES) + \
-      CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS( \
-        CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS) + \
       CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \
         CONFIGURE_MAXIMUM_POSIX_SEMAPHORES) + \
       CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(CONFIGURE_MAXIMUM_POSIX_BARRIERS) + \
@@ -3369,7 +3342,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
       CONFIGURE_MAXIMUM_POSIX_TIMERS,
       CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
       CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
-      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS,
       CONFIGURE_MAXIMUM_POSIX_SEMAPHORES,
       CONFIGURE_MAXIMUM_POSIX_BARRIERS,
       CONFIGURE_MAXIMUM_POSIX_RWLOCKS,
@@ -3727,7 +3699,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
        (CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
        (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
        (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
-       (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS != 0) || \
        (CONFIGURE_MAXIMUM_POSIX_SEMAPHORES != 0) || \
        (CONFIGURE_MAXIMUM_POSIX_BARRIERS != 0) || \
        (CONFIGURE_MAXIMUM_POSIX_SPINLOCKS != 0) || \
@@ -3795,14 +3766,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
   #error "Maximum priority configured higher than supported by target."
 #endif
 
-/*
- *  If you have fewer POSIX Message Queue Descriptors than actual
- *  POSIX Message Queues, then you will not be able to open all the
- *  queues.
- */
-#if (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS < \
-     CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES)
-  #error "Fewer POSIX Message Queue descriptors than Queues!"
+#ifdef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS
+  #warning "The CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTOR configuration option is obsolete!"
 #endif
 
 /*
diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h
index 776c871..2d9c374 100644
--- a/cpukit/score/include/rtems/score/objectimpl.h
+++ b/cpukit/score/include/rtems/score/objectimpl.h
@@ -86,7 +86,6 @@ typedef enum {
   OBJECTS_POSIX_THREADS             = 1,
   OBJECTS_POSIX_KEYS                = 2,
   OBJECTS_POSIX_INTERRUPTS          = 3,
-  OBJECTS_POSIX_MESSAGE_QUEUE_FDS   = 4,
   OBJECTS_POSIX_MESSAGE_QUEUES      = 5,
   OBJECTS_POSIX_MUTEXES             = 6,
   OBJECTS_POSIX_SEMAPHORES          = 7,
diff --git a/testsuites/psxtests/psxconfig01/init.c b/testsuites/psxtests/psxconfig01/init.c
index b4c555e..1edd9ba 100644
--- a/testsuites/psxtests/psxconfig01/init.c
+++ b/testsuites/psxtests/psxconfig01/init.c
@@ -130,7 +130,6 @@ const char rtems_test_name[] = "PSXCONFIG 1";
 #endif
 
 #ifdef POSIX_MQ_COUNT
-  #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS POSIX_MQ_COUNT
   #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES POSIX_MQ_COUNT
 
   #define POSIX_MQ_0_COUNT 2
@@ -501,10 +500,6 @@ static rtems_task Init(rtems_task_argument argument)
   }
   rtems_resource_snapshot_take(&snapshot);
   rtems_test_assert(
-    snapshot.posix_api.active_message_queue_descriptors
-      == CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS
-  );
-  rtems_test_assert(
     snapshot.posix_api.active_message_queues
       == CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
   );
diff --git a/testsuites/psxtests/psxmsgq04/init.c b/testsuites/psxtests/psxmsgq04/init.c
index 7086cbe..f1e1c96 100644
--- a/testsuites/psxtests/psxmsgq04/init.c
+++ b/testsuites/psxtests/psxmsgq04/init.c
@@ -137,7 +137,6 @@ void *POSIX_Init(
 
 #define CONFIGURE_MAXIMUM_POSIX_THREADS                   1
 #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES            1
-#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS 2
 
 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
 
diff --git a/testsuites/psxtmtests/psxtmmq01/init.c b/testsuites/psxtmtests/psxtmmq01/init.c
index aacd968..a5ed4fc 100644
--- a/testsuites/psxtmtests/psxtmmq01/init.c
+++ b/testsuites/psxtmtests/psxtmmq01/init.c
@@ -301,7 +301,6 @@ void *POSIX_Init(
 #define CONFIGURE_MAXIMUM_POSIX_THREADS     1
 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
 #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES  2
-#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS 2
 
 #define CONFIGURE_INIT
 
diff --git a/testsuites/sptests/spthreadq01/init.c b/testsuites/sptests/spthreadq01/init.c
index fb2be64..cb8d495 100644
--- a/testsuites/sptests/spthreadq01/init.c
+++ b/testsuites/sptests/spthreadq01/init.c
@@ -25,8 +25,6 @@
   #include <semaphore.h>
   #include <string.h>
   #include <pthread.h>
-
-  #include <rtems/posix/mqueueimpl.h>
 #endif
 
 const char rtems_test_name[] = "SPTHREADQ 1";
@@ -121,9 +119,6 @@ static void posix_worker(test_context *ctx)
   int rv;
   int eno;
   char buf[1];
-  POSIX_Message_queue_Control_fd *the_mq_fd;
-  Objects_Locations location;
-  ISR_lock_Context lock_context;
 
   wake_up_master(ctx);
   rtems_test_assert(get_wait_id(ctx) == ctx->psem);
@@ -161,15 +156,7 @@ static void posix_worker(test_context *ctx)
   rtems_test_assert(eno == 0);
 
   wake_up_master(ctx);
-  the_mq_fd = _POSIX_Message_queue_Get_fd_interrupt_disable(
-    ctx->pmq,
-    &location,
-    &lock_context
-  );
-  _ISR_lock_ISR_enable(&lock_context);
-  rtems_test_assert(the_mq_fd != NULL);
-  rtems_test_assert(location == OBJECTS_LOCAL);
-  rtems_test_assert(get_wait_id(ctx) == the_mq_fd->Queue->Object.id);
+  rtems_test_assert(get_wait_id(ctx) == ctx->pmq);
 
   buf[0] = 'x';
   rv = mq_send(ctx->pmq, &buf[0], sizeof(buf), 0);
@@ -397,7 +384,6 @@ static rtems_task Init(
   #define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 1
   #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 1
   #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 1
-  #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS 1
   #define CONFIGURE_MESSAGE_BUFFER_MEMORY \
     (2 * CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(1, 1))
 #else



More information about the vc mailing list