21 #ifndef _TBB_observer_proxy_H 22 #define _TBB_observer_proxy_H 24 #if __TBB_SCHEDULER_OBSERVER 39 typedef aligned_space<spin_rw_mutex> my_mutex_type;
42 observer_proxy* my_head;
45 observer_proxy* my_tail;
48 my_mutex_type my_mutex;
55 inline static void remove_ref_fast( observer_proxy*&
p );
58 void do_notify_entry_observers( observer_proxy*&
last,
bool worker );
61 void do_notify_exit_observers( observer_proxy*
last,
bool worker );
64 observer_list () : my_head(NULL), my_tail(NULL) {}
71 void insert ( observer_proxy*
p );
74 void remove ( observer_proxy*
p );
78 void remove_ref( observer_proxy*
p );
81 typedef spin_rw_mutex::scoped_lock scoped_lock;
86 bool empty ()
const {
return my_head == NULL; }
91 inline void notify_entry_observers( observer_proxy*&
last,
bool worker );
94 inline void notify_exit_observers( observer_proxy*&
last,
bool worker );
97 bool ask_permission_to_leave();
104 class observer_proxy {
105 friend class task_scheduler_observer_v3;
106 friend class observer_list;
111 atomic<int> my_ref_count;
113 observer_list* my_list;
116 observer_proxy* my_next;
119 observer_proxy* my_prev;
121 task_scheduler_observer_v3* my_observer;
125 #if __TBB_ARENA_OBSERVER || __TBB_SLEEP_PERMISSION 128 #if __TBB_ARENA_OBSERVER 133 observer_proxy( task_scheduler_observer_v3& );
140 observer_proxy& operator = (
const observer_proxy& );
143 inline void observer_list::remove_ref_fast( observer_proxy*&
p ) {
144 if( p->my_observer ) {
146 int r = --p->my_ref_count;
154 inline void observer_list::notify_entry_observers( observer_proxy*&
last,
bool worker ) {
155 if ( last == my_tail )
157 do_notify_entry_observers( last, worker );
160 inline void observer_list::notify_exit_observers( observer_proxy*& last,
bool worker ) {
164 do_notify_exit_observers( last, worker );
169 extern padded<observer_list> the_global_observer_list;
tbb::internal::task_scheduler_observer_v3 task_scheduler_observer
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
#define __TBB_ASSERT_EX(predicate, comment)
"Extended" version is useful to suppress warnings if a variable is only used with an assert ...
void const char const char int ITT_FORMAT __itt_group_sync p
auto last(Container &c) -> decltype(begin(c))
spin_rw_mutex_v3 spin_rw_mutex