4 #include "queue_item.h"
11 typedef Spin_lock_coloc<Mword> Inner_lock;
14 class Lock_n_ptr : public Inner_lock
17 Queue_item *item() const
18 { return reinterpret_cast<Queue_item*>(get_unused() & ~5UL); }
20 void set_item(Queue_item *i)
22 assert_kdb (!(Mword(i) & 5));
23 set_unused((Mword)i | (get_unused() & 5));
27 { return get_unused() & 1; }
30 { return set_unused(get_unused() | 1); }
33 { set_unused(get_unused() & ~1); }
36 { return get_unused() & 4; }
39 { set_unused(get_unused() | 4); }
42 struct Queue_head_policy
44 typedef Lock_n_ptr Head_type;
45 static Queue_item *head(Head_type const &h) { return h.item(); }
46 static void set_head(Head_type &h, Queue_item *v) { h.set_item(v); }
49 typedef cxx::Sd_list<Queue_item, cxx::D_list_item_policy, Queue_head_policy> List;
55 //--------------------------------------------------------------------------
59 #include "std_macros.h"
68 { return &_m.head(); }
70 PUBLIC inline NEEDS["kdb_ke.h"]
72 Queue::enqueue(Queue_item *i)
74 // Queue i at the end of the list
75 assert_kdb (_m.head().test());
80 PUBLIC inline NEEDS["kdb_ke.h", "std_macros.h"]
82 Queue::dequeue(Queue_item *i, Queue_item::Status reason)
84 assert_kdb (_m.head().test());
85 assert_kdb (i->queued());
87 if (EXPECT_FALSE(i->_q != this))
91 i->_q = (Queue*)reason;
98 { return _m.front(); }
102 Queue::blocked() const
103 { return _m.head().blocked(); }
105 PUBLIC inline NEEDS["kdb_ke.h"]
109 assert_kdb (_m.head().test());
113 PUBLIC inline NEEDS["kdb_ke.h"]
117 assert_kdb (_m.head().test());
121 PUBLIC inline NEEDS["kdb_ke.h"]
123 Queue::invalid() const
125 assert_kdb (_m.head().test());
126 return _m.head().invalid();
129 PUBLIC inline NEEDS["kdb_ke.h"]
133 assert_kdb (_m.head().test());
134 _m.head().invalidate();