summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/src/coremutexseize.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-11-30 14:08:30 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-11-30 14:08:30 +0000
commit43b6f757ce6127d95778fe2eaa9e3a9fc3a06ae3 (patch)
treeb8cce290191ffcee0ce79451897a0ce89aec6af2 /c/src/exec/score/src/coremutexseize.c
parent2000-11-30 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-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--c/src/exec/score/src/coremutexseize.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/c/src/exec/score/src/coremutexseize.c b/c/src/exec/score/src/coremutexseize.c
index 500c8bb61c..a4aadb7410 100644
--- a/c/src/exec/score/src/coremutexseize.c
+++ b/c/src/exec/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