diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-29 11:05:36 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-02 07:46:15 +0200 |
commit | 7e66865e17d7a82add541056de13717793da002a (patch) | |
tree | 924312da2c1abe33c48b6ec84102cde59c28074c /cpukit/posix/src | |
parent | score: _CORE_message_queue_Insert_message() (diff) | |
download | rtems-7e66865e17d7a82add541056de13717793da002a.tar.bz2 |
score: Move message notification
Move message notification to end of critical section and delegate the
message queue release to the notification handler. It may do more
complex notification actions out of the critical section.
Update #2555.
Diffstat (limited to 'cpukit/posix/src')
-rw-r--r-- | cpukit/posix/src/mqueuenotify.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/cpukit/posix/src/mqueuenotify.c b/cpukit/posix/src/mqueuenotify.c index 810097691f..d31a8e662d 100644 --- a/cpukit/posix/src/mqueuenotify.c +++ b/cpukit/posix/src/mqueuenotify.c @@ -39,16 +39,24 @@ */ static void _POSIX_Message_queue_Notify_handler( - void *user_data + CORE_message_queue_Control *the_message_queue, + ISR_lock_Context *lock_context ) { POSIX_Message_queue_Control *the_mq; + int signo; - the_mq = user_data; + the_mq = RTEMS_CONTAINER_OF( + the_message_queue, + POSIX_Message_queue_Control, + Message_queue + ); - kill( getpid(), the_mq->notification.sigev_signo ); + signo = the_mq->notification.sigev_signo; + _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL ); + _CORE_message_queue_Release( &the_mq->Message_queue, lock_context ); - _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL ); + kill( getpid(), signo ); } int mq_notify( @@ -72,18 +80,17 @@ int mq_notify( rtems_set_errno_and_return_minus_one( EBUSY ); } - _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL ); + _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL ); the_mq->notification = *notification; _CORE_message_queue_Set_notify( &the_mq->Message_queue, - _POSIX_Message_queue_Notify_handler, - the_mq + _POSIX_Message_queue_Notify_handler ); } else { - _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL ); + _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL ); } |