summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/coremsgsubmit.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-29 11:05:36 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-02 07:46:15 +0200
commit7e66865e17d7a82add541056de13717793da002a (patch)
tree924312da2c1abe33c48b6ec84102cde59c28074c /cpukit/score/src/coremsgsubmit.c
parentscore: _CORE_message_queue_Insert_message() (diff)
downloadrtems-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/score/src/coremsgsubmit.c')
-rw-r--r--cpukit/score/src/coremsgsubmit.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/cpukit/score/src/coremsgsubmit.c b/cpukit/score/src/coremsgsubmit.c
index 1d6d298ea7..7e589e7754 100644
--- a/cpukit/score/src/coremsgsubmit.c
+++ b/cpukit/score/src/coremsgsubmit.c
@@ -79,7 +79,28 @@ CORE_message_queue_Status _CORE_message_queue_Do_submit(
size,
submit_type
);
+
+#if defined(RTEMS_SCORE_COREMSG_ENABLE_NOTIFICATION)
+ /*
+ * According to POSIX, does this happen before or after the message
+ * is actually enqueued. It is logical to think afterwards, because
+ * the message is actually in the queue at this point.
+ */
+ if (
+ the_message_queue->number_of_pending_messages == 1
+ && the_message_queue->notify_handler != NULL
+ ) {
+ ( *the_message_queue->notify_handler )(
+ the_message_queue,
+ lock_context
+ );
+ } else {
+ _CORE_message_queue_Release( the_message_queue, lock_context );
+ }
+#else
_CORE_message_queue_Release( the_message_queue, lock_context );
+#endif
+
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}