diff --git a/examples/example.c b/examples/example.c index 0bdb510..2643521 100644 --- a/examples/example.c +++ b/examples/example.c @@ -51,8 +51,8 @@ int main(void) itimespec.it_interval.tv_sec = 1; itimespec.it_interval.tv_nsec = 0; - timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL); - TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL); + timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL, NULL); + TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL, NULL); printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test)); sleep(4);//getchar(); diff --git a/source/mt_timer.c b/source/mt_timer.c index f625d60..fb28156 100644 --- a/source/mt_timer.c +++ b/source/mt_timer.c @@ -61,13 +61,13 @@ void timer_deinit(MT_TIMER_OBJECT *object) itimespec.it_interval.tv_sec = 0; itimespec.it_interval.tv_nsec = 0; - timer_add(object, &itimespec, 0, NULL, NULL); + timer_add(object, &itimespec, 0, NULL, NULL, NULL); pthread_join(object->timer_thread_id, NULL); timer_clear(object); } int timer_add(MT_TIMER_OBJECT *object, struct itimerspec *itimespec, - int repeat, timer_callback_t cb, void *data) + int repeat, timer_callback_t cb, void *data, timer_release_t rb) { struct epoll_event event; MT_TIMER_NODE *handler = NULL; @@ -80,6 +80,7 @@ int timer_add(MT_TIMER_OBJECT *object, struct itimerspec *itimespec, } handler->timer_cb = cb; + handler->release_cb = rb; handler->timer_cnt = repeat; handler->timer_data = data; handler->timer_fd = timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC|TFD_NONBLOCK); @@ -137,6 +138,8 @@ int timer_del(MT_TIMER_OBJECT *object, int timerfd) HASH_DEL(object->timer_head, handler); pthread_rwlock_unlock(&object->timer_rwlock); close(handler->timer_fd); + if(handler->release_cb) + handler->release_cb(handler->timer_data); free(handler); return 0; @@ -165,6 +168,8 @@ int timer_clear(MT_TIMER_OBJECT *object) HASH_DEL(object->timer_head, handler); pthread_rwlock_unlock(&object->timer_rwlock); close(handler->timer_fd); + if(handler->release_cb) + handler->release_cb(handler->timer_data); free(handler); } return 0; diff --git a/source/mt_timer.h b/source/mt_timer.h index 6514a03..7e8abfa 100644 --- a/source/mt_timer.h +++ b/source/mt_timer.h @@ -70,6 +70,7 @@ typedef enum{false, true} bool; #define bool bool #endif +typedef void (*timer_release_t)(void *data); typedef void (*timer_callback_t)(void *data); typedef struct { @@ -78,6 +79,7 @@ typedef struct { void *timer_data; UT_hash_handle hh; timer_callback_t timer_cb; + timer_release_t release_cb; }MT_TIMER_NODE; /* MT mean multiple */ typedef struct { @@ -130,6 +132,8 @@ typedef struct { HASH_DEL(mt_timer_##name.timer_head, timer_node); \ pthread_rwlock_unlock(&mt_timer_##name.timer_rwlock); \ close(timer_node->timer_fd); \ + if(timer_node->release_cb) \ + timer_node->release_cb(timer_node->timer_data); \ free(timer_node); \ } \ } \ @@ -142,7 +146,7 @@ typedef struct { extern int timer_init(MT_TIMER_OBJECT *object, void *(*thread_handler)(void *arg), int max_num); extern void timer_deinit(MT_TIMER_OBJECT *object); extern int timer_add(MT_TIMER_OBJECT *object, struct itimerspec *itimespec, - int repeat, timer_callback_t cb, void *data); + int repeat, timer_callback_t cb, void *data, timer_release_t rb); extern int timer_del(MT_TIMER_OBJECT *object, int timerfd); extern int timer_count(MT_TIMER_OBJECT *object); extern int timer_clear(MT_TIMER_OBJECT *object); @@ -157,8 +161,8 @@ extern int timer_clear(MT_TIMER_OBJECT *object); timer_init(&mt_timer_##name, mt_timer_thread_##name, max) #define TIMER_DEINIT(name) \ timer_deinit(&mt_timer_##name) -#define TIMER_ADD(name, itimespec, repeat, cb, data) \ - timer_add(&mt_timer_##name, itimespec, repeat, cb, data) +#define TIMER_ADD(name, itimespec, repeat, cb, data, rb) \ + timer_add(&mt_timer_##name, itimespec, repeat, cb, data, rb) #define TIMER_DEL(name, timerfd) \ timer_del(&mt_timer_##name, timerfd) #define TIMER_COUNT(name) timer_count(&mt_timer_##name)