add release callback for userdata
Signed-off-by: AaronKonishi <konishi5202@163.com>master
parent
07764643ac
commit
da4e0bf67e
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue