2929using namespace std ::chrono;
3030
3131#define IS_NODE_INVALID (_node_ ) \
32- (!_node_ || !_node_->handler || (_node_->req_type < 0 || _node_->req_type >= INVALID_TIMER))
32+ (!_node_ || !_node_->handler.load() || (_node_->req_type < 0 || _node_->req_type >= INVALID_TIMER))
3333
3434
3535timer::timer ()
@@ -54,7 +54,7 @@ timer::~timer()
5454
5555void timer::add_new_timer (unsigned int timeout_msec, timer_node_t * node, timer_handler* handler, void * user_data, timer_req_type_t req_type)
5656{
57- node->handler = handler;
57+ node->handler . store ( handler) ;
5858 node->req_type = req_type;
5959 node->user_data = user_data;
6060 node->orig_time_msec = milliseconds (timeout_msec);
@@ -94,22 +94,22 @@ void timer::remove_timer(timer_node_t* node, timer_handler *handler)
9494 if (!node) {
9595 node = m_list_head;
9696 while (node) {
97- if (node->handler == handler) // node found
97+ if (node->handler . load () == handler) // node found
9898 break ;
9999 node = node->next ;
100100 }
101101 }
102102
103103 // Here we MUST have a valid node pointer
104104 BULLSEYE_EXCLUDE_BLOCK_START
105- if (IS_NODE_INVALID (node) || (node->handler != handler)) {
105+ if (IS_NODE_INVALID (node) || (node->handler . load () != handler)) {
106106 tmr_logfunc (" bad <node,handler> combo for removale (%p,%p)" , node, handler);
107107 return ;
108108 }
109109 BULLSEYE_EXCLUDE_BLOCK_END
110110
111111 // Invalidate node before freeing it
112- node->handler = NULL ;
112+ node->handler . store ( nullptr ) ;
113113 node->req_type = INVALID_TIMER;
114114
115115 // Remove & Free node
@@ -125,18 +125,18 @@ void timer::remove_all_timers(timer_handler *handler)
125125
126126 // Look for handler in the list if node wasen't indicated
127127 while (node) {
128- if (node->handler == handler) {// node found
128+ if (node->handler . load () == handler) {// node found
129129 node_tmp = node;
130130 node = node->next ;
131131 // Here we MUST have a valid node pointer
132132 BULLSEYE_EXCLUDE_BLOCK_START
133- if (IS_NODE_INVALID (node_tmp) || (node_tmp->handler != handler)) {
133+ if (IS_NODE_INVALID (node_tmp) || (node_tmp->handler . load () != handler)) {
134134 tmr_logfunc (" bad <node,handler> combo for removale (%p,%p)" , node_tmp, handler);
135135 continue ;
136136 }
137137 BULLSEYE_EXCLUDE_BLOCK_END
138138 // Invalidate node before freeing it
139- node_tmp->handler = NULL ;
139+ node_tmp->handler . store ( nullptr ) ;
140140 node_tmp->req_type = INVALID_TIMER;
141141 remove_from_list (node_tmp);
142142 // Remove & Free node
@@ -200,19 +200,11 @@ void timer::process_registered_timers()
200200 timer_node_t * iter = m_list_head;
201201 timer_node_t * next_iter;
202202 while (iter && (iter->delta_time_msec == milliseconds (0 ))) {
203- tmr_logfuncall (" timer expired on %p" , iter->handler );
204-
205- /* Special check is need to protect
206- * from using destroyed object pointed by handler
207- * See unregister_timer_event()
208- * Object can be destoyed from another thread (lock protection)
209- * and from current thread (lock and lock count condition)
210- */
211- if (iter->handler &&
212- !iter->lock_timer .trylock () &&
213- (1 == iter->lock_timer .is_locked_by_me ())) {
214- iter->handler ->handle_timer_expired (iter->user_data );
215- iter->lock_timer .unlock ();
203+ timer_handler * handler = iter->handler .load ();
204+ tmr_logfuncall (" timer expired on %p" , handler);
205+
206+ if (handler) {
207+ handler->safe_handle_timer_expired (iter->user_data );
216208 }
217209 next_iter = iter->next ;
218210
@@ -225,13 +217,13 @@ void timer::process_registered_timers()
225217 break ;
226218
227219 case ONE_SHOT_TIMER:
228- remove_timer (iter, iter-> handler );
220+ remove_timer (iter, handler);
229221 break ;
230222
231223 BULLSEYE_EXCLUDE_BLOCK_START
232224 case INVALID_TIMER:
233225 default :
234- tmr_logwarn (" invalid timer expired on %p" , iter-> handler );
226+ tmr_logwarn (" invalid timer expired on %p" , handler);
235227 break ;
236228 }
237229 BULLSEYE_EXCLUDE_BLOCK_END
0 commit comments