summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-01 11:38:47 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-06 09:08:21 +0200
commit8f9658187a46f3c3ee3d7c7b68491fab5175a8fd (patch)
treec1887c2441887909201698b8d16b8cb2e8598188 /cpukit/rtems/src
parentscore: Simplify _Thread_queue_Do_flush() (diff)
downloadrtems-8f9658187a46f3c3ee3d7c7b68491fab5175a8fd.tar.bz2
score: Rework MP thread queue callout support
The thread queue implementation was heavily reworked to support SMP. This broke the multiprocessing support of the thread queues. This is fixed by this patch. A thread proxy is unblocked due to three reasons 1) timeout, 2) request satisfaction, and 3) extraction. In case 1) no MPCI message must be sent. This is ensured via the _Thread_queue_MP_callout_do_nothing() callout set during _Thread_MP_Allocate_proxy(). In case 2) and 3) an MPCI message must be sent. In case we interrupt the blocking operation during _Thread_queue_Enqueue_critical(), then this message must be sent by the blocking thread. For this the new fields Thread_Proxy_control::thread_queue_callout and Thread_Proxy_control::thread_queue_id are used. Delete the individual API MP callout types and use Thread_queue_MP_callout throughout. This type is only defined in multiprocessing configurations. Prefix the multiprocessing parameters with mp_ to ease code review. Multiprocessing specific parameters are optional due to use of a similar macro pattern. There is no overhead for non-multiprocessing configurations.
Diffstat (limited to 'cpukit/rtems/src')
-rw-r--r--cpukit/rtems/src/barrierrelease.c2
-rw-r--r--cpukit/rtems/src/barrierwait.c4
-rw-r--r--cpukit/rtems/src/msgqbroadcast.c6
-rw-r--r--cpukit/rtems/src/msgqsend.c25
-rw-r--r--cpukit/rtems/src/msgqurgent.c8
-rw-r--r--cpukit/rtems/src/semrelease.c24
6 files changed, 8 insertions, 61 deletions
diff --git a/cpukit/rtems/src/barrierrelease.c b/cpukit/rtems/src/barrierrelease.c
index 1901df51a7..02500e5a84 100644
--- a/cpukit/rtems/src/barrierrelease.c
+++ b/cpukit/rtems/src/barrierrelease.c
@@ -54,7 +54,7 @@ rtems_status_code rtems_barrier_release(
switch ( location ) {
case OBJECTS_LOCAL:
- *released = _CORE_barrier_Release( &the_barrier->Barrier, id, NULL );
+ *released = _CORE_barrier_Release( &the_barrier->Barrier, NULL, 0 );
_Objects_Put( &the_barrier->Object );
return RTEMS_SUCCESSFUL;
diff --git a/cpukit/rtems/src/barrierwait.c b/cpukit/rtems/src/barrierwait.c
index 3a3059363c..b2999eb5f9 100644
--- a/cpukit/rtems/src/barrierwait.c
+++ b/cpukit/rtems/src/barrierwait.c
@@ -43,10 +43,10 @@ rtems_status_code rtems_barrier_wait(
_CORE_barrier_Wait(
&the_barrier->Barrier,
executing,
- id,
true,
timeout,
- NULL
+ NULL,
+ 0
);
_Objects_Put( &the_barrier->Object );
return _Barrier_Translate_core_barrier_return_code(
diff --git a/cpukit/rtems/src/msgqbroadcast.c b/cpukit/rtems/src/msgqbroadcast.c
index aabbf3f6ac..7bd7e3b810 100644
--- a/cpukit/rtems/src/msgqbroadcast.c
+++ b/cpukit/rtems/src/msgqbroadcast.c
@@ -60,12 +60,8 @@ rtems_status_code rtems_message_queue_broadcast(
&the_message_queue->message_queue,
buffer,
size,
+ _Message_queue_Core_message_queue_mp_support,
id,
- #if defined(RTEMS_MULTIPROCESSING)
- _Message_queue_Core_message_queue_mp_support,
- #else
- NULL,
- #endif
count,
&lock_context
);
diff --git a/cpukit/rtems/src/msgqsend.c b/cpukit/rtems/src/msgqsend.c
index fb3979ed78..6f3009de14 100644
--- a/cpukit/rtems/src/msgqsend.c
+++ b/cpukit/rtems/src/msgqsend.c
@@ -30,29 +30,6 @@
#include <rtems/rtems/options.h>
#include <rtems/rtems/support.h>
-/*
- *
- * rtems_message_queue_send
- *
- * This routine implements the directive rtems_message_queue_send. It sends a
- * message to the specified message queue.
- *
- * Input parameters:
- * id - pointer to message queue
- * buffer - pointer to message buffer
- * size - size of message to send
- *
- * Output parameters:
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
- */
-
-#if defined(RTEMS_MULTIPROCESSING)
-#define MESSAGE_QUEUE_MP_HANDLER _Message_queue_Core_message_queue_mp_support
-#else
-#define MESSAGE_QUEUE_MP_HANDLER NULL
-#endif
-
rtems_status_code rtems_message_queue_send(
rtems_id id,
const void *buffer,
@@ -79,8 +56,8 @@ rtems_status_code rtems_message_queue_send(
&the_message_queue->message_queue,
buffer,
size,
+ _Message_queue_Core_message_queue_mp_support,
id,
- MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0, /* no timeout */
&lock_context
diff --git a/cpukit/rtems/src/msgqurgent.c b/cpukit/rtems/src/msgqurgent.c
index e6ae5efcf0..a328741628 100644
--- a/cpukit/rtems/src/msgqurgent.c
+++ b/cpukit/rtems/src/msgqurgent.c
@@ -30,12 +30,6 @@
#include <rtems/rtems/options.h>
#include <rtems/rtems/support.h>
-#if defined(RTEMS_MULTIPROCESSING)
-#define MESSAGE_QUEUE_MP_HANDLER _Message_queue_Core_message_queue_mp_support
-#else
-#define MESSAGE_QUEUE_MP_HANDLER NULL
-#endif
-
rtems_status_code rtems_message_queue_urgent(
rtems_id id,
const void *buffer,
@@ -62,8 +56,8 @@ rtems_status_code rtems_message_queue_urgent(
&the_message_queue->message_queue,
buffer,
size,
+ _Message_queue_Core_message_queue_mp_support,
id,
- MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0, /* no timeout */
&lock_context
diff --git a/cpukit/rtems/src/semrelease.c b/cpukit/rtems/src/semrelease.c
index 5d41b6cfae..4a6ccb2817 100644
--- a/cpukit/rtems/src/semrelease.c
+++ b/cpukit/rtems/src/semrelease.c
@@ -31,28 +31,8 @@
#include <rtems/score/coremuteximpl.h>
#include <rtems/score/coresemimpl.h>
#include <rtems/score/thread.h>
-
#include <rtems/score/interr.h>
-/*
- * rtems_semaphore_release
- *
- * This directive allows a thread to release a semaphore.
- *
- * Input parameters:
- * id - semaphore id
- *
- * Output parameters:
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
- */
-
-#if defined(RTEMS_MULTIPROCESSING)
-#define MUTEX_MP_SUPPORT _Semaphore_Core_mutex_mp_support
-#else
-#define MUTEX_MP_SUPPORT NULL
-#endif
-
rtems_status_code rtems_semaphore_release(
rtems_id id
)
@@ -88,16 +68,16 @@ rtems_status_code rtems_semaphore_release(
if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) {
mutex_status = _CORE_mutex_Surrender(
&the_semaphore->Core_control.mutex,
+ _Semaphore_Core_mutex_mp_support,
id,
- MUTEX_MP_SUPPORT,
&lock_context
);
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
} else {
semaphore_status = _CORE_semaphore_Surrender(
&the_semaphore->Core_control.semaphore,
+ _Semaphore_Core_mutex_mp_support,
id,
- MUTEX_MP_SUPPORT,
&lock_context
);
return