17 #ifndef _TBB_observer_proxy_H 18 #define _TBB_observer_proxy_H 20 #if __TBB_SCHEDULER_OBSERVER 35 typedef aligned_space<spin_rw_mutex> my_mutex_type;
38 observer_proxy* my_head;
41 observer_proxy* my_tail;
44 my_mutex_type my_mutex;
51 inline static void remove_ref_fast( observer_proxy*&
p );
54 void do_notify_entry_observers( observer_proxy*&
last,
bool worker );
57 void do_notify_exit_observers( observer_proxy*
last,
bool worker );
60 observer_list () : my_head(NULL), my_tail(NULL) {}
67 void insert ( observer_proxy*
p );
70 void remove ( observer_proxy*
p );
74 void remove_ref( observer_proxy*
p );
77 typedef spin_rw_mutex::scoped_lock scoped_lock;
82 bool empty ()
const {
return my_head == NULL; }
87 inline void notify_entry_observers( observer_proxy*&
last,
bool worker );
90 inline void notify_exit_observers( observer_proxy*&
last,
bool worker );
97 class observer_proxy {
98 friend class task_scheduler_observer_v3;
99 friend class observer_list;
104 atomic<int> my_ref_count;
106 observer_list* my_list;
109 observer_proxy* my_next;
112 observer_proxy* my_prev;
114 task_scheduler_observer_v3* my_observer;
118 #if __TBB_ARENA_OBSERVER 119 interface6::task_scheduler_observer* get_v6_observer();
121 #if __TBB_ARENA_OBSERVER 126 observer_proxy( task_scheduler_observer_v3& );
133 observer_proxy& operator = (
const observer_proxy& );
136 inline void observer_list::remove_ref_fast( observer_proxy*&
p ) {
137 if(
p->my_observer ) {
139 int r = --
p->my_ref_count;
147 inline void observer_list::notify_entry_observers( observer_proxy*&
last,
bool worker ) {
148 if (
last == my_tail )
150 do_notify_entry_observers(
last, worker );
153 inline void observer_list::notify_exit_observers( observer_proxy*&
last,
bool worker ) {
157 do_notify_exit_observers(
last, worker );
162 extern padded<observer_list> the_global_observer_list;
spin_rw_mutex_v3 spin_rw_mutex
auto last(Container &c) -> decltype(begin(c))
void const char const char int ITT_FORMAT __itt_group_sync p
#define __TBB_ASSERT_EX(predicate, comment)
"Extended" version is useful to suppress warnings if a variable is only used with an assert
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.