diff --git a/src/event/event_linux.c b/src/event/event_linux.c index d1448d3c..db9be37e 100644 --- a/src/event/event_linux.c +++ b/src/event/event_linux.c @@ -42,6 +42,7 @@ struct neu_event_timer { struct itimerspec value; nng_mtx *mtx; + bool stop; }; struct neu_event_io { @@ -102,9 +103,11 @@ static void *event_loop(void *arg) ssize_t size = read(data->fd, &t, sizeof(t)); assert(size != -1); - nng_mtx_lock(data->ctx.timer->mtx); - ret = data->callback.timer(data->usr_data); - nng_mtx_unlock(data->ctx.timer->mtx); + if (!data->ctx.timer->stop) { + nng_mtx_lock(data->ctx.timer->mtx); + ret = data->callback.timer(data->usr_data); + nng_mtx_unlock(data->ctx.timer->mtx); + } } break; case IO: @@ -180,6 +183,7 @@ neu_event_timer_t *neu_event_add_timer(neu_events_t * events, timer_ctx->value = value; timer_ctx->fd = timer_fd; timer_ctx->event_data = data; + timer_ctx->stop = false; nng_mtx_alloc(&timer_ctx->mtx); ret = epoll_ctl(events->epoll_fd, EPOLL_CTL_ADD, timer_fd, &event); @@ -198,6 +202,7 @@ int neu_event_del_timer(neu_events_t *events, neu_event_timer_t *timer) zlog_info(neuron, "del timer: %d from epoll: %d", timer->fd, events->epoll_fd); + timer->stop = true; nng_mtx_lock(timer->mtx); close(timer->fd); epoll_ctl(events->epoll_fd, EPOLL_CTL_DEL, timer->fd, NULL);