summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/coresemimpl.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-15 21:18:26 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-21 07:29:39 +0200
commitadbedd10cfe5259018b1682d903ab40f6005b3f0 (patch)
treedde02dde8c5760625667a949661f0bfab266e0dc /cpukit/score/include/rtems/score/coresemimpl.h
parentposix: Avoid Giant lock for mutexes (diff)
downloadrtems-adbedd10cfe5259018b1682d903ab40f6005b3f0.tar.bz2
score: Introduce _Thread_queue_Flush_critical()
Replace _Thread_queue_Flush() with _Thread_queue_Flush_critical() and add a filter function for customization of the thread queue flush operation. Update #2555.
Diffstat (limited to 'cpukit/score/include/rtems/score/coresemimpl.h')
-rw-r--r--cpukit/score/include/rtems/score/coresemimpl.h46
1 files changed, 36 insertions, 10 deletions
diff --git a/cpukit/score/include/rtems/score/coresemimpl.h b/cpukit/score/include/rtems/score/coresemimpl.h
index e0e278843e..fd01f93150 100644
--- a/cpukit/score/include/rtems/score/coresemimpl.h
+++ b/cpukit/score/include/rtems/score/coresemimpl.h
@@ -86,18 +86,36 @@ void _CORE_semaphore_Initialize(
uint32_t initial_value
);
+Thread_Control *_CORE_semaphore_Was_deleted(
+ Thread_Control *the_thread,
+ Thread_queue_Queue *queue,
+ ISR_lock_Context *lock_context
+);
+
+Thread_Control *_CORE_semaphore_Unsatisfied_nowait(
+ Thread_Control *the_thread,
+ Thread_queue_Queue *queue,
+ ISR_lock_Context *lock_context
+);
+
#define _CORE_semaphore_Destroy( \
the_semaphore, \
mp_callout, \
mp_id \
) \
do { \
- _Thread_queue_Flush( \
+ ISR_lock_Context _core_semaphore_destroy_lock_context; \
+ _Thread_queue_Acquire( \
&( the_semaphore )->Wait_queue, \
+ &_core_semaphore_destroy_lock_context \
+ ); \
+ _Thread_queue_Flush_critical( \
+ &( the_semaphore )->Wait_queue.Queue, \
( the_semaphore )->operations, \
- CORE_SEMAPHORE_WAS_DELETED, \
+ _CORE_semaphore_Was_deleted, \
mp_callout, \
- mp_id \
+ mp_id, \
+ &_core_semaphore_destroy_lock_context \
); \
_Thread_queue_Destroy( &( the_semaphore )->Wait_queue ); \
} while ( 0 )
@@ -192,13 +210,21 @@ RTEMS_INLINE_ROUTINE CORE_semaphore_Status _CORE_semaphore_Do_surrender(
mp_callout, \
mp_id \
) \
- _Thread_queue_Flush( \
- &( the_semaphore )->Wait_queue, \
- ( the_semaphore )->operations, \
- CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT, \
- mp_callout, \
- mp_id \
- )
+ do { \
+ ISR_lock_Context _core_semaphore_flush_lock_context; \
+ _Thread_queue_Acquire( \
+ &( the_semaphore )->Wait_queue, \
+ &_core_semaphore_flush_lock_context \
+ ); \
+ _Thread_queue_Flush_critical( \
+ &( the_semaphore )->Wait_queue.Queue, \
+ ( the_semaphore )->operations, \
+ _CORE_semaphore_Unsatisfied_nowait, \
+ mp_callout, \
+ mp_id, \
+ &_core_semaphore_flush_lock_context \
+ ); \
+ } while ( 0 )
/**
* This routine returns the current count associated with the semaphore.