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 (i && !i->queued());
76 assert_kdb (_m.head().test());
81 PUBLIC inline NEEDS["kdb_ke.h", "std_macros.h"]
83 Queue::dequeue(Queue_item *i, Queue_item::Status reason)
85 assert_kdb (_m.head().test());
86 assert_kdb (i->queued());
88 if (EXPECT_FALSE(i->_q != this))
92 i->_q = (Queue*)reason;
99 { return _m.front(); }
103 Queue::blocked() const
104 { return _m.head().blocked(); }
106 PUBLIC inline NEEDS["kdb_ke.h"]
110 assert_kdb (_m.head().test());
114 PUBLIC inline NEEDS["kdb_ke.h"]
118 assert_kdb (_m.head().test());
122 PUBLIC inline NEEDS["kdb_ke.h"]
124 Queue::invalid() const
126 assert_kdb (_m.head().test());
127 return _m.head().invalid();
130 PUBLIC inline NEEDS["kdb_ke.h"]
134 assert_kdb (_m.head().test());
135 _m.head().invalidate();