diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-11-30 14:08:30 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-11-30 14:08:30 +0000 |
commit | 43b6f757ce6127d95778fe2eaa9e3a9fc3a06ae3 (patch) | |
tree | b8cce290191ffcee0ce79451897a0ce89aec6af2 /cpukit/score/src/coremutexseize.c | |
parent | 2000-11-30 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-43b6f757ce6127d95778fe2eaa9e3a9fc3a06ae3.tar.bz2 |
2000-11-30 Joel Sherrill <joel@OARcorp.com>
* General effort to make things compile with macros not inlines
* inline/rtems/score/coremutex.inl: Added comment indicating
for macros there is another copy of
_CORE_mutex_Seize_interrupt_trylock() in src/coremutexseize.c.
* src/coremutexseize.c: Added body of
_CORE_mutex_Seize_interrupt_trylock() for macro case.
* macros/rtems/score/coremutex.inl: Added prototype for
_CORE_mutex_Seize_interrupt_trylock() since there is a real
body when macros are enabled.
* macros/rtems/score/coresem.inl: Added macro implementation of
_CORE_semaphore_Seize_isr_disable.
* macros/score/Makefile.am: Fixed typos.
* rtems/score/address.inl: Correct macro implementation of
_Addresses_Is_aligned() so it would compile.
* macros/rtems/score/coremsg.inl: Added closing parentheses.
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/coremutexseize.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/cpukit/score/src/coremutexseize.c b/cpukit/score/src/coremutexseize.c index 500c8bb61c..a4aadb7410 100644 --- a/cpukit/score/src/coremutexseize.c +++ b/cpukit/score/src/coremutexseize.c @@ -82,3 +82,63 @@ void _CORE_mutex_Seize_interrupt_blocking( } _Thread_Enable_dispatch(); } + +#if !defined(USE_INLINES) +int _CORE_mutex_Seize_interrupt_trylock( + CORE_mutex_Control *the_mutex, + ISR_Level *level_p +) +{ + Thread_Control *executing; + ISR_Level level = *level_p; + + /* disabled when you get here */ + + executing = _Thread_Executing; + executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; + if ( !_CORE_mutex_Is_locked( the_mutex ) ) { + the_mutex->lock = CORE_MUTEX_LOCKED; + the_mutex->holder = executing; + the_mutex->holder_id = executing->Object.id; + the_mutex->nest_count = 1; + executing->resource_count++; + if ( the_mutex->Attributes.discipline != + CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) { + _ISR_Enable( level ); + return 0; + } + /* else must be CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING */ + { + Priority_Control ceiling; + Priority_Control current; + + ceiling = the_mutex->Attributes.priority_ceiling; + current = executing->current_priority; + if ( current == ceiling ) { + _ISR_Enable( level ); + return 0; + } + if ( current > ceiling ) { + _Thread_Disable_dispatch(); + _ISR_Enable( level ); + _Thread_Change_priority( + the_mutex->holder, + the_mutex->Attributes.priority_ceiling, + FALSE + ); + _Thread_Enable_dispatch(); + return 0; + } + /* if ( current < ceiling ) */ { + executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; + the_mutex->nest_count = 0; /* undo locking above */ + executing->resource_count--; /* undo locking above */ + _ISR_Enable( level ); + return 0; + } + } + return 0; + } + return 1; +} +#endif |