Lines Matching refs:p

57         while ( observer_proxy *p = next ) {  in clear()  local
58 next = p->my_next; in clear()
61 d1::task_scheduler_observer *obs = p->my_observer; in clear()
64 if (!obs || !(p = obs->my_proxy.exchange(nullptr))) { in clear()
68 __TBB_ASSERT(!next || p == next->my_prev, nullptr); in clear()
69 __TBB_ASSERT(is_alive(p->my_ref_count), "Observer's proxy died prematurely"); in clear()
70 …__TBB_ASSERT(p->my_ref_count.load(std::memory_order_relaxed) == 1, "Reference for observer is miss… in clear()
71 poison_pointer(p->my_observer); in clear()
72 remove(p); in clear()
73 --p->my_ref_count; in clear()
74 delete p; in clear()
90 void observer_list::insert( observer_proxy* p ) { in insert() argument
93 p->my_prev = my_tail.load(std::memory_order_relaxed); in insert()
94 my_tail.load(std::memory_order_relaxed)->my_next = p; in insert()
96 my_head.store(p, std::memory_order_relaxed); in insert()
98 my_tail.store(p, std::memory_order_relaxed); in insert()
101 void observer_list::remove(observer_proxy* p) { in remove() argument
104 if (p == my_tail.load(std::memory_order_relaxed)) { in remove()
105 __TBB_ASSERT(!p->my_next, nullptr); in remove()
106 my_tail.store(p->my_prev, std::memory_order_relaxed); in remove()
108 __TBB_ASSERT(p->my_next, nullptr); in remove()
109 p->my_next->my_prev = p->my_prev; in remove()
111 if (p == my_head.load(std::memory_order_relaxed)) { in remove()
112 __TBB_ASSERT(!p->my_prev, nullptr); in remove()
113 my_head.store(p->my_next, std::memory_order_relaxed); in remove()
115 __TBB_ASSERT(p->my_prev, nullptr); in remove()
116 p->my_prev->my_next = p->my_next; in remove()
122 void observer_list::remove_ref(observer_proxy* p) { in remove_ref() argument
123 std::uintptr_t r = p->my_ref_count.load(std::memory_order_acquire); in remove_ref()
126 if (p->my_ref_count.compare_exchange_strong(r, r - 1)) { in remove_ref()
135 r = --p->my_ref_count; in remove_ref()
137 remove(p); in remove_ref()
140 __TBB_ASSERT(r || !p->my_ref_count, nullptr); in remove_ref()
142 delete p; in remove_ref()
148 observer_proxy* p = last, * prev = p; in do_notify_entry_observers() local
155 if (p) { in do_notify_entry_observers()
157 if (observer_proxy* q = p->my_next) { in do_notify_entry_observers()
158 if (p == prev) { in do_notify_entry_observers()
161 p = q; in do_notify_entry_observers()
164 if (p == prev) { in do_notify_entry_observers()
166 …__TBB_ASSERT(int(p->my_ref_count.load(std::memory_order_relaxed)) >= 1 + (p->my_observer ? 1 : 0),… in do_notify_entry_observers()
169 … __TBB_ASSERT(int(p->my_ref_count.load(std::memory_order_relaxed)), nullptr); in do_notify_entry_observers()
170 ++p->my_ref_count; in do_notify_entry_observers()
176 last = p; in do_notify_entry_observers()
181 p = my_head.load(std::memory_order_relaxed); in do_notify_entry_observers()
182 if (!p) { in do_notify_entry_observers()
186 tso = p->my_observer; in do_notify_entry_observers()
188 ++p->my_ref_count; in do_notify_entry_observers()
191 __TBB_ASSERT(!prev || p != prev, nullptr); in do_notify_entry_observers()
200 __TBB_ASSERT(p->my_ref_count.load(std::memory_order_relaxed), nullptr); in do_notify_entry_observers()
203 prev = p; in do_notify_entry_observers()
209 observer_proxy* p = nullptr, * prev = nullptr; in do_notify_exit_observers() local
216 if (p) { in do_notify_exit_observers()
218 if (p != last) { in do_notify_exit_observers()
219 … __TBB_ASSERT(p->my_next, "List items before 'last' must have valid my_next pointer"); in do_notify_exit_observers()
220 if (p == prev) in do_notify_exit_observers()
222 p = p->my_next; in do_notify_exit_observers()
225 remove_ref_fast(p); in do_notify_exit_observers()
226 if (p) { in do_notify_exit_observers()
228 if (p != prev && prev) { in do_notify_exit_observers()
231 remove_ref(p); in do_notify_exit_observers()
237 p = my_head.load(std::memory_order_relaxed); in do_notify_exit_observers()
238 … __TBB_ASSERT(p, "Nonzero 'last' must guarantee that the global list is non-empty"); in do_notify_exit_observers()
240 tso = p->my_observer; in do_notify_exit_observers()
243 if (p != last) // the last is already referenced since entry notification in do_notify_exit_observers()
244 ++p->my_ref_count; in do_notify_exit_observers()
247 __TBB_ASSERT(!prev || p != prev, nullptr); in do_notify_exit_observers()
254 __TBB_ASSERT(p->my_ref_count || p == last, nullptr); in do_notify_exit_observers()
257 prev = p; in do_notify_exit_observers()
264 observer_proxy* p = new observer_proxy(tso); in observe() local
265 tso.my_proxy.store(p, std::memory_order_relaxed); in observe()
269 if (p->my_observer->my_task_arena == nullptr) { in observe()
275 p->my_list = &td->my_arena->my_observers; in observe()
277 d1::task_arena* ta = p->my_observer->my_task_arena; in observe()
284 p->my_list = &a->my_observers; in observe()
286 p->my_list->insert(p); in observe()
288 if (td && td->my_arena && &td->my_arena->my_observers == p->my_list) { in observe()
289 p->my_list->notify_entry_observers(td->my_last_observer, td->my_is_worker); in observe()