summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-01-05 22:19:21 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-01-05 22:19:21 +0000
commit5870ac55678115857215a4199f519263599ee341 (patch)
tree8b6f044ae7cccc3da9a3bd69b2468c2ca77acff8 /cpukit/rtems/src
parentUpdated to reflect a time that had previously been left out due to (diff)
downloadrtems-5870ac55678115857215a4199f519263599ee341.tar.bz2
Added support for simple binary semaphores in addition to the high
power binary/mutex style semaphores already supported by RTEMS. This was done at the request of Eric Norum <eric@cls.usask.ca> in support of his effort to port EPICS to RTEMS. This change consisted of changing the nesting_allowed boolean into a lock_nesting_behavior enumerated value as well as allowing the core mutex object to optionally support ensuring that the holder of a binary semaphore released it. Finally, a more subtle enhancement was to allow the non-holder to release a priority inheritance/ceiling mutex and still allow the holding task to return to its original priority.
Diffstat (limited to 'cpukit/rtems/src')
-rw-r--r--cpukit/rtems/src/semcreate.c41
-rw-r--r--cpukit/rtems/src/semdelete.c2
-rw-r--r--cpukit/rtems/src/semflush.c2
-rw-r--r--cpukit/rtems/src/semobtain.c2
-rw-r--r--cpukit/rtems/src/semrelease.c2
5 files changed, 34 insertions, 15 deletions
diff --git a/cpukit/rtems/src/semcreate.c b/cpukit/rtems/src/semcreate.c
index a63814acfe..3ffbfc39c0 100644
--- a/cpukit/rtems/src/semcreate.c
+++ b/cpukit/rtems/src/semcreate.c
@@ -96,13 +96,15 @@ rtems_status_code rtems_semaphore_create(
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
- if ( ! ( _Attributes_Is_binary_semaphore( attribute_set ) &&
+ if ( ! ( (_Attributes_Is_binary_semaphore( attribute_set ) ||
+ _Attributes_Is_simple_binary_semaphore( attribute_set )) &&
+
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
- if ( _Attributes_Is_binary_semaphore( attribute_set ) && ( count > 1 ) )
+ if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch(); /* prevents deletion */
@@ -126,7 +128,13 @@ rtems_status_code rtems_semaphore_create(
the_semaphore->attribute_set = attribute_set;
- if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
+ /*
+ * If it is not a counting, semaphore, then it is either a
+ * simple binary semaphore or a more powerful lmutex style binary
+ * semaphore.
+ */
+
+ if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) )
the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
else if ( _Attributes_Is_priority_ceiling( attribute_set ) )
@@ -136,12 +144,24 @@ rtems_status_code rtems_semaphore_create(
else
the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
- if ( _Attributes_Is_nesting_allowed( attribute_set ) )
- the_mutex_attributes.allow_nesting = TRUE;
- else
- the_mutex_attributes.allow_nesting = FALSE;
- /* Add priority ceiling code here ????? */
+ if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
+ the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
+
+ switch ( the_mutex_attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ the_mutex_attributes.only_owner_release = FALSE;
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ the_mutex_attributes.only_owner_release = TRUE;
+ break;
+ }
+ } else {
+ the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
+ the_mutex_attributes.only_owner_release = FALSE;
+ }
the_mutex_attributes.priority_ceiling = priority_ceiling;
@@ -161,8 +181,7 @@ rtems_status_code rtems_semaphore_create(
NULL
#endif
);
- }
- else {
+ } else {
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
else
@@ -178,7 +197,7 @@ rtems_status_code rtems_semaphore_create(
* The following are just to make Purify happy.
*/
- the_mutex_attributes.allow_nesting = TRUE;
+ the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attributes.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
diff --git a/cpukit/rtems/src/semdelete.c b/cpukit/rtems/src/semdelete.c
index 3bbc4001a1..1e9b165c71 100644
--- a/cpukit/rtems/src/semdelete.c
+++ b/cpukit/rtems/src/semdelete.c
@@ -81,7 +81,7 @@ rtems_status_code rtems_semaphore_delete(
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set) ) {
+ if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
diff --git a/cpukit/rtems/src/semflush.c b/cpukit/rtems/src/semflush.c
index 43e690479a..dcdd8b1b34 100644
--- a/cpukit/rtems/src/semflush.c
+++ b/cpukit/rtems/src/semflush.c
@@ -77,7 +77,7 @@ rtems_status_code rtems_semaphore_flush(
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
- if ( _Attributes_Is_binary_semaphore(the_semaphore->attribute_set) ) {
+ if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
_CORE_mutex_Flush(
&the_semaphore->Core_control.mutex,
SEND_OBJECT_WAS_DELETED,
diff --git a/cpukit/rtems/src/semobtain.c b/cpukit/rtems/src/semobtain.c
index 5c8eb400fb..fef659d3cb 100644
--- a/cpukit/rtems/src/semobtain.c
+++ b/cpukit/rtems/src/semobtain.c
@@ -92,7 +92,7 @@ rtems_status_code rtems_semaphore_obtain(
else
wait = TRUE;
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
+ if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
_CORE_mutex_Seize(
&the_semaphore->Core_control.mutex,
id,
diff --git a/cpukit/rtems/src/semrelease.c b/cpukit/rtems/src/semrelease.c
index d33c857437..2f05b6503f 100644
--- a/cpukit/rtems/src/semrelease.c
+++ b/cpukit/rtems/src/semrelease.c
@@ -85,7 +85,7 @@ rtems_status_code rtems_semaphore_release(
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
+ if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
mutex_status = _CORE_mutex_Surrender(
&the_semaphore->Core_control.mutex,
id,