summaryrefslogtreecommitdiffstats
path: root/rtemsbsd/include/machine/rtems-bsd-muteximpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'rtemsbsd/include/machine/rtems-bsd-muteximpl.h')
-rw-r--r--rtemsbsd/include/machine/rtems-bsd-muteximpl.h36
1 files changed, 22 insertions, 14 deletions
diff --git a/rtemsbsd/include/machine/rtems-bsd-muteximpl.h b/rtemsbsd/include/machine/rtems-bsd-muteximpl.h
index 644f6f5d..45f501c6 100644
--- a/rtemsbsd/include/machine/rtems-bsd-muteximpl.h
+++ b/rtemsbsd/include/machine/rtems-bsd-muteximpl.h
@@ -57,10 +57,9 @@ static inline void
rtems_bsd_mutex_init(struct lock_object *lock, rtems_bsd_mutex *m,
struct lock_class *class, const char *name, const char *type, int flags)
{
- _ISR_lock_Initialize(&m->lock, name);
+ _Thread_queue_Initialize(&m->queue, THREAD_QUEUE_DISCIPLINE_PRIORITY);
m->owner = NULL;
m->nest_level = 0;
- _RBTree_Initialize_empty(&m->rivals);
lock_init(lock, class, name, type, flags);
}
@@ -76,16 +75,16 @@ rtems_bsd_mutex_lock(struct lock_object *lock, rtems_bsd_mutex *m)
Thread_Control *executing;
Thread_Control *owner;
- _ISR_lock_ISR_disable_and_acquire(&m->lock, &lock_context);
+ _Thread_queue_Acquire(&m->queue, &lock_context);
owner = m->owner;
executing = _Thread_Executing;
+ ++executing->resource_count;
if (__predict_true(owner == NULL)) {
m->owner = executing;
- ++executing->resource_count;
- _ISR_lock_Release_and_ISR_enable(&m->lock, &lock_context);
+ _Thread_queue_Release(&m->queue, &lock_context);
} else {
rtems_bsd_mutex_lock_more(lock, m, owner, executing,
&lock_context);
@@ -100,7 +99,7 @@ rtems_bsd_mutex_trylock(struct lock_object *lock, rtems_bsd_mutex *m)
Thread_Control *executing;
Thread_Control *owner;
- _ISR_lock_ISR_disable_and_acquire(&m->lock, &lock_context);
+ _Thread_queue_Acquire(&m->queue, &lock_context);
owner = m->owner;
executing = _Thread_Executing;
@@ -117,7 +116,7 @@ rtems_bsd_mutex_trylock(struct lock_object *lock, rtems_bsd_mutex *m)
success = 0;
}
- _ISR_lock_Release_and_ISR_enable(&m->lock, &lock_context);
+ _Thread_queue_Release(&m->queue, &lock_context);
return (success);
}
@@ -132,7 +131,7 @@ rtems_bsd_mutex_unlock(rtems_bsd_mutex *m)
Thread_Control *owner;
int nest_level;
- _ISR_lock_ISR_disable_and_acquire(&m->lock, &lock_context);
+ _Thread_queue_Acquire(&m->queue, &lock_context);
nest_level = m->nest_level;
owner = m->owner;
@@ -140,17 +139,26 @@ rtems_bsd_mutex_unlock(rtems_bsd_mutex *m)
BSD_ASSERT(owner == _Thread_Executing);
if (__predict_true(nest_level == 0)) {
- RBTree_Node *first = _RBTree_First(&m->rivals, RBT_LEFT);
+ RBTree_Node *first;
int keep_priority;
--owner->resource_count;
+
+ /*
+ * Ensure that the owner resource count is visible to all other
+ * processors and that we read the latest priority restore
+ * hint.
+ */
+ _Atomic_Fence( ATOMIC_ORDER_ACQ_REL );
+
+ first = _RBTree_First(&m->queue.Queues.Priority, RBT_LEFT);
keep_priority = _Thread_Owns_resources(owner)
- || owner->real_priority == owner->current_priority;
+ || !owner->priority_restore_hint;
m->owner = NULL;
if (__predict_true(first == NULL && keep_priority)) {
- _ISR_lock_Release_and_ISR_enable(&m->lock, &lock_context);
+ _Thread_queue_Release(&m->queue, &lock_context);
} else {
rtems_bsd_mutex_unlock_more(m, owner, keep_priority,
first, &lock_context);
@@ -159,7 +167,7 @@ rtems_bsd_mutex_unlock(rtems_bsd_mutex *m)
} else {
m->nest_level = nest_level - 1;
- _ISR_lock_Release_and_ISR_enable(&m->lock, &lock_context);
+ _Thread_queue_Release(&m->queue, &lock_context);
}
}
@@ -180,14 +188,14 @@ rtems_bsd_mutex_recursed(rtems_bsd_mutex *m)
static inline void
rtems_bsd_mutex_destroy(struct lock_object *lock, rtems_bsd_mutex *m)
{
- BSD_ASSERT(_RBTree_Is_empty(&m->rivals));
+ BSD_ASSERT(_RBTree_Is_empty(&m->queue.Queues.Priority));
if (rtems_bsd_mutex_owned(m)) {
m->nest_level = 0;
rtems_bsd_mutex_unlock(m);
}
- _ISR_lock_Destroy(&m->lock);
+ _Thread_queue_Dequeue(&m->queue);
lock_destroy(lock);
}