@@ -92,11 +92,14 @@ class CallbackManager {
9292 bool found_needs_ids = false ;
9393 auto init_handles = [
9494 scope, &found_active_cb, &found_needs_inputs, &found_needs_ids](
95- CallbackHandles& handles, RecordFunctionCallbacks& cbs) {
95+ CallbackHandles& handles, RecordFunctionCallbacks& cbs, ObserverContextList& ctx_list ) {
9696 handles.clear ();
97+
98+ size_t num_callbacks = 0 ;
9799 for (const auto & cb : cbs) {
98100 if (cb.first .shouldRun (scope)) {
99101 handles.push_back (cb.second );
102+ ++num_callbacks;
100103 found_active_cb = true ;
101104 if (cb.first .needsInputs ()) {
102105 found_needs_inputs = true ;
@@ -106,10 +109,12 @@ class CallbackManager {
106109 }
107110 }
108111 }
112+ // Pre-allocate observer context list with nullptr.
113+ ctx_list.resize (num_callbacks);
109114 };
110115
111- init_handles (rec_fn.sorted_active_tls_handles_ , sorted_tls_callbacks_);
112- init_handles (rec_fn.sorted_active_global_handles_ , sorted_global_callbacks_);
116+ init_handles (rec_fn.sorted_active_tls_handles_ , sorted_tls_callbacks_, rec_fn. tls_ctx_ );
117+ init_handles (rec_fn.sorted_active_global_handles_ , sorted_global_callbacks_, rec_fn. global_ctx_ );
113118 rec_fn.active = found_active_cb;
114119 rec_fn.needs_inputs = found_needs_inputs;
115120 if (found_needs_ids && found_active_cb) {
@@ -121,11 +126,13 @@ class CallbackManager {
121126 mergeRunCallbacks (
122127 sorted_global_callbacks_,
123128 rf.sorted_active_global_handles_ ,
129+ rf.global_ctx_ ,
124130 /* is_start */ true ,
125131 rf);
126132 mergeRunCallbacks (
127133 sorted_tls_callbacks_,
128134 rf.sorted_active_tls_handles_ ,
135+ rf.tls_ctx_ ,
129136 /* is_start */ true ,
130137 rf);
131138 rf.called_start_callbacks_ = true ;
@@ -135,21 +142,30 @@ class CallbackManager {
135142 mergeRunCallbacks (
136143 sorted_global_callbacks_,
137144 rf.sorted_active_global_handles_ ,
145+ rf.global_ctx_ ,
138146 /* is_start */ false ,
139147 rf);
140148 mergeRunCallbacks (
141149 sorted_tls_callbacks_,
142150 rf.sorted_active_tls_handles_ ,
151+ rf.tls_ctx_ ,
143152 /* is_start */ false ,
144153 rf);
145154 }
146155
147156 private:
148157 bool tryRunCallback (
149- const std::function<void (const RecordFunction&)>& fn,
150- RecordFunction& rf) {
158+ const RecordFunctionCallback& rfcb,
159+ RecordFunction& rf,
160+ std::unique_ptr<ObserverContext>& ctx,
161+ bool is_start) {
151162 try {
152- fn (rf);
163+ if (is_start) {
164+ ctx = rfcb.start ()(rf);
165+ }
166+ else {
167+ rfcb.end ()(rf, ctx.get ());
168+ }
153169 return true ;
154170 } catch (const std::exception &e) {
155171 LOG (WARNING) << " Exception in RecordFunction callback: "
@@ -165,11 +181,12 @@ class CallbackManager {
165181 void mergeRunCallbacks (
166182 const RecordFunctionCallbacks& sorted_callbacks,
167183 const CallbackHandles& sorted_handles,
184+ ObserverContextList& ctx_list,
168185 bool is_start,
169186 RecordFunction& rf) {
170187 size_t num_executed = 0 ;
171188 size_t idx_c = 0 ;
172- for (size_t idx_h = 0 ; idx_h < sorted_handles.size (); ++idx_h) {
189+ for (size_t idx_h = 0 ; idx_h < sorted_handles.size () && idx_h < ctx_list. size () ; ++idx_h) {
173190 while (idx_c < sorted_callbacks.size () &&
174191 sorted_callbacks[idx_c].second < sorted_handles[idx_h]) {
175192 ++idx_c;
@@ -178,11 +195,7 @@ class CallbackManager {
178195 break ;
179196 }
180197 if (sorted_callbacks[idx_c].second == sorted_handles[idx_h]) {
181- if (is_start) {
182- tryRunCallback (sorted_callbacks[idx_c].first .start (), rf);
183- } else {
184- tryRunCallback (sorted_callbacks[idx_c].first .end (), rf);
185- }
198+ tryRunCallback (sorted_callbacks[idx_c].first , rf, ctx_list[idx_h], is_start);
186199 ++num_executed;
187200 }
188201 }
0 commit comments