8 enum Status { Not_locked, Locked, Invalid };
11 /** queue of blocked threads */
16 //----------------------------------------------------------------------------
23 #include "lock_guard.h"
24 #include "thread_state.h"
25 //#include "logdefs.h"
27 PUBLIC inline NEEDS["context.h", "cpu_lock.h", "globals.h",
28 "kdb_ke.h", "lock_guard.h", "thread_state.h"]
30 Mp_lock::test_and_set()
32 //assert_kdb (cpu_lock.test());
34 Context *const c = current();
36 auto g = lock_guard(cpu_lock);
39 auto guard = lock_guard(_q.q_lock());
40 if (EXPECT_FALSE(_q.invalid()))
45 // lock was free, take it
50 _q.enqueue(c->queue_item());
52 // LOG_MSG_3VAL(c, "block", (Mword)this, current_cpu(), *((Mword*)this));
53 assert_kdb (!(c->state() & Thread_drq_ready));
56 c->state_change_dirty(~Thread_ready, Thread_waiting);
59 if (!c->queue_item()->queued())
63 c->state_del_dirty(Thread_waiting);
65 // LOG_MSG_3VAL(c, "woke", (Mword)this, current_cpu(), 0);
67 switch (c->queue_item()->status())
69 case Queue_item::Ok: return Not_locked;
70 case Queue_item::Invalid: return Invalid;
71 case Queue_item::Retry: assert_kdb (false);
77 PUBLIC inline NEEDS[Mp_lock::test_and_set]
80 { return test_and_set(); }
82 PUBLIC inline NEEDS["context.h", "cpu_lock.h", "globals.h",
83 "kdb_ke.h", "lock_guard.h"]
87 //assert_kdb (cpu_lock.test());
92 auto guard = lock_guard(_q.q_lock());
93 //LOG_MSG_3VAL(current(), "clear", (Mword)this, current_cpu(), *((Mword*)this));
94 assert_kdb (_q.blocked());
103 _q.dequeue(f, Queue_item::Ok);
105 // LOG_MSG_3VAL(current(), "wake", Mword(context_of(f)), (Mword)this, current_cpu());
106 assert_kdb (current()->state() & Thread_ready_mask);
107 context_of(f)->activate();
110 PUBLIC inline NEEDS["kdb_ke.h"]
115 Context *const c = current();
117 auto g = lock_guard(cpu_lock);
120 auto guard = lock_guard(_q.q_lock());
121 assert_kdb (invalid());
126 _q.enqueue(c->queue_item());
131 c->state_change_dirty(~Thread_ready, Thread_waiting);
134 if (!c->queue_item()->queued())
138 c->state_del_dirty(Thread_waiting);
143 Mp_lock::test() const
144 { return _q.blocked(); }
147 PUBLIC inline NEEDS[Mp_lock::clear]
149 Mp_lock::set(Status s)
157 Mp_lock::invalidate()
160 auto guard = lock_guard(_q.q_lock());
167 auto guard = lock_guard(_q.q_lock());
170 //LOG_MSG_3VAL(current(), "deq", Mword(f), 0, 0);
174 _q.dequeue(f, Queue_item::Invalid);
175 context_of(f)->activate();
181 Mp_lock::invalid() const
182 { return _q.invalid(); }