diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-25 06:33:28 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-02 07:46:13 +0200 |
commit | 3e36a16774290447e98a0261e625c38d00f2e19b (patch) | |
tree | c907237968596fd8e4bb647f87186d88318d9a32 /cpukit/posix/src/mqueueopen.c | |
parent | bsp/qoriq: Add and use qoriq_reset_qman_and_bman() (diff) | |
download | rtems-3e36a16774290447e98a0261e625c38d00f2e19b.tar.bz2 |
posix: _POSIX_Message_queue_Create_support()
Make _POSIX_Message_queue_Create_support() static since it is only used
by mq_open().
Diffstat (limited to 'cpukit/posix/src/mqueueopen.c')
-rw-r--r-- | cpukit/posix/src/mqueueopen.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/cpukit/posix/src/mqueueopen.c b/cpukit/posix/src/mqueueopen.c index d327e13fac..bfdff0382a 100644 --- a/cpukit/posix/src/mqueueopen.c +++ b/cpukit/posix/src/mqueueopen.c @@ -45,6 +45,95 @@ #define MQ_OPEN_FAILED ((mqd_t) -1) +static int _POSIX_Message_queue_Create_support( + const char *name_arg, + size_t name_len, + int pshared, + struct mq_attr *attr_ptr, + POSIX_Message_queue_Control **message_queue +) +{ + POSIX_Message_queue_Control *the_mq; + struct mq_attr attr; + 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 ); + } + + attr = *attr_ptr; + } + + the_mq = _POSIX_Message_queue_Allocate(); + if ( !the_mq ) { + _Objects_Allocator_unlock(); + rtems_set_errno_and_return_minus_one( ENFILE ); + } + + /* + * Make a copy of the user's string for name just in case it was + * dynamically constructed. + */ + 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 ); + } + + the_mq->process_shared = pshared; + the_mq->named = true; + the_mq->open_count = 1; + the_mq->linked = true; + + /* + * NOTE: That thread blocking discipline should be based on the + * current scheduling policy. + * + * 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 + ) ) { + + _POSIX_Message_queue_Free( the_mq ); + _Workspace_Free(name); + _Objects_Allocator_unlock(); + rtems_set_errno_and_return_minus_one( ENOSPC ); + } + + _Objects_Open_string( + &_POSIX_Message_queue_Information, + &the_mq->Object, + name + ); + + *message_queue = the_mq; + + _Objects_Allocator_unlock(); + return 0; +} + /* * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272 */ |