[PATCH 3/4] score: Add _Thread_Lock_acquire_critical()
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Jul 5 08:33:18 UTC 2016
Keep interrupts disabled during the thread lock acquire sequence.
---
cpukit/score/include/rtems/score/threadimpl.h | 31 +++++++++++++++++++--------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
index 448f38d..182cb3a 100644
--- a/cpukit/score/include/rtems/score/threadimpl.h
+++ b/cpukit/score/include/rtems/score/threadimpl.h
@@ -1105,14 +1105,14 @@ RTEMS_INLINE_ROUTINE void _Thread_Lock_release_default(
}
/**
- * @brief Acquires the thread lock.
+ * @brief Acquires the thread lock inside a critical section (interrupts disabled).
*
* @param[in] the_thread The thread.
- * @param[in] lock_context The lock context for _Thread_Lock_release().
+ * @param[in] lock_context The lock context for _Thread_Lock_release_critical().
*
- * @return The lock required by _Thread_Lock_release().
+ * @return The lock required by _Thread_Lock_release_critical().
*/
-RTEMS_INLINE_ROUTINE void *_Thread_Lock_acquire(
+RTEMS_INLINE_ROUTINE void *_Thread_Lock_acquire_critical(
Thread_Control *the_thread,
ISR_lock_Context *lock_context
)
@@ -1123,8 +1123,6 @@ RTEMS_INLINE_ROUTINE void *_Thread_Lock_acquire(
while ( true ) {
SMP_ticket_lock_Control *lock_1;
- _ISR_lock_ISR_disable( lock_context );
-
/*
* We assume that a normal load of pointer is identical to a relaxed atomic
* load. Here, we may read an out-of-date lock. However, only the owner
@@ -1168,15 +1166,30 @@ RTEMS_INLINE_ROUTINE void *_Thread_Lock_acquire(
return lock_0;
}
- _Thread_Lock_release( lock_0, lock_context );
+ _Thread_Lock_release_critical( lock_0, lock_context );
}
#else
- _ISR_Local_disable( lock_context->isr_level );
-
return NULL;
#endif
}
+/**
+ * @brief Acquires the thread lock.
+ *
+ * @param[in] the_thread The thread.
+ * @param[in] lock_context The lock context for _Thread_Lock_release().
+ *
+ * @return The lock required by _Thread_Lock_release().
+ */
+RTEMS_INLINE_ROUTINE void *_Thread_Lock_acquire(
+ Thread_Control *the_thread,
+ ISR_lock_Context *lock_context
+)
+{
+ _ISR_lock_ISR_disable( lock_context );
+ return _Thread_Lock_acquire_critical( the_thread, lock_context );
+}
+
#if defined(RTEMS_SMP)
/*
* Internal function, use _Thread_Lock_set() or _Thread_Lock_restore_default()
--
1.8.4.5
More information about the devel
mailing list