@@ -38,9 +38,9 @@ struct TreeNode::PImpl
38
38
39
39
std::string registration_ID;
40
40
41
- PreTickCallback substitution_callback ;
42
-
43
- PostTickCallback post_condition_callback ;
41
+ PreTickCallback pre_tick_callback ;
42
+ PostTickCallback post_tick_callback;
43
+ TickMonitorCallback tick_monitor_callback ;
44
44
45
45
std::mutex callback_injection_mutex;
46
46
@@ -70,6 +70,7 @@ TreeNode::~TreeNode()
70
70
71
71
NodeStatus TreeNode::executeTick ()
72
72
{
73
+ std::unique_lock lk (_p->callback_injection_mutex );
73
74
auto new_status = _p->status ;
74
75
75
76
// a pre-condition may return the new status.
@@ -82,48 +83,48 @@ NodeStatus TreeNode::executeTick()
82
83
{
83
84
// injected pre-callback
84
85
bool substituted = false ;
85
- if (!isStatusCompleted (_p->status ))
86
+ if (_p-> pre_tick_callback && !isStatusCompleted (_p->status ))
86
87
{
87
- PreTickCallback callback;
88
- {
89
- std::unique_lock lk (_p->callback_injection_mutex );
90
- callback = _p->substitution_callback ;
91
- }
92
- if (callback)
88
+ auto override_status = _p->pre_tick_callback (*this );
89
+ if (isStatusCompleted (override_status))
93
90
{
94
- auto override_status = callback (*this );
95
- if (isStatusCompleted (override_status))
96
- {
97
- // don't execute the actual tick()
98
- substituted = true ;
99
- new_status = override_status;
100
- }
91
+ // don't execute the actual tick()
92
+ substituted = true ;
93
+ new_status = override_status;
101
94
}
102
95
}
103
96
104
97
// Call the ACTUAL tick
105
98
if (!substituted)
106
99
{
107
- new_status = tick ();
100
+ if (_p->tick_monitor_callback )
101
+ {
102
+ using namespace std ::chrono;
103
+ auto t1 = steady_clock::now ();
104
+ new_status = tick ();
105
+ auto t2 = steady_clock::now ();
106
+ _p->tick_monitor_callback (*this , new_status,
107
+ duration_cast<microseconds>(t2 - t1));
108
+ }
109
+ else
110
+ {
111
+ new_status = tick ();
112
+ }
108
113
}
109
114
}
110
115
111
116
// injected post callback
112
117
if (isStatusCompleted (new_status))
113
118
{
114
119
checkPostConditions (new_status);
115
- PostTickCallback callback;
116
- {
117
- std::unique_lock lk (_p->callback_injection_mutex );
118
- callback = _p-> post_condition_callback ;
119
- }
120
- if (callback )
120
+ }
121
+
122
+ if (_p->post_tick_callback )
123
+ {
124
+ auto override_status = _p-> post_tick_callback (* this , new_status);
125
+ if (isStatusCompleted (override_status) )
121
126
{
122
- auto override_status = callback (*this , new_status);
123
- if (isStatusCompleted (override_status))
124
- {
125
- new_status = override_status;
126
- }
127
+ new_status = override_status;
127
128
}
128
129
}
129
130
@@ -308,13 +309,19 @@ TreeNode::subscribeToStatusChange(TreeNode::StatusChangeCallback callback)
308
309
void TreeNode::setPreTickFunction (PreTickCallback callback)
309
310
{
310
311
std::unique_lock lk (_p->callback_injection_mutex );
311
- _p->substitution_callback = callback;
312
+ _p->pre_tick_callback = callback;
312
313
}
313
314
314
315
void TreeNode::setPostTickFunction (PostTickCallback callback)
315
316
{
316
317
std::unique_lock lk (_p->callback_injection_mutex );
317
- _p->post_condition_callback = callback;
318
+ _p->post_tick_callback = callback;
319
+ }
320
+
321
+ void TreeNode::setTickMonitorCallback (TickMonitorCallback callback)
322
+ {
323
+ std::unique_lock lk (_p->callback_injection_mutex );
324
+ _p->tick_monitor_callback = callback;
318
325
}
319
326
320
327
uint16_t TreeNode::UID () const
0 commit comments