int swTimer_add(swTimer *timer, int ms) { swTimer_node *node = sw_malloc(sizeof(swTimer_node)); if (node == NULL) { swWarn("malloc failed."); return SW_ERR; } bzero(node, sizeof(swTimer_node)); node->lasttime = swTimer_get_ms(); node->interval = ms; if (ms < timer->interval) { int new_interval = swoole_common_divisor(ms, timer->interval); timer->interval = new_interval; if (SwooleG.use_timerfd) { swTimer_timerfd_set(timer, new_interval); } else { swTimer_signal_set(timer, new_interval); } } swHashMap_add_int(timer->list, ms, node); timer->num++; return SW_OK; }
/** * create timer */ int swTimer_init(int interval, int use_pipe) { swTimer *timer = &SwooleG.timer; timer->interval = interval; timer->lasttime = interval; #ifndef HAVE_TIMERFD SwooleG.use_timerfd = 0; #endif timer->list = swHashMap_new(SW_HASHMAP_INIT_BUCKET_N, free); if (!timer->list) { return SW_ERR; } if (SwooleG.use_timerfd) { if (swTimer_timerfd_set(timer, interval) < 0) { return SW_ERR; } timer->use_pipe = 0; } else { if (use_pipe) { if (swPipeNotify_auto(&timer->pipe, 0, 0) < 0) { return SW_ERR; } timer->fd = timer->pipe.getFd(&timer->pipe, 0); timer->use_pipe = 1; } else { timer->fd = 1; timer->use_pipe = 0; } if (swTimer_signal_set(timer, interval) < 0) { return SW_ERR; } swSignal_add(SIGALRM, swTimer_signal_handler); } if (timer->fd > 1) { SwooleG.main_reactor->setHandle(SwooleG.main_reactor, SW_FD_TIMER, swTimer_event_handler); SwooleG.main_reactor->add(SwooleG.main_reactor, SwooleG.timer.fd, SW_FD_TIMER); } timer->add = swTimer_add; timer->del = swTimer_del; timer->select = swTimer_select; timer->free = swTimer_free; return SW_OK; }
/** * 创建定时器 */ int swTimer_create(swTimer *timer, int interval) { timer->interval = interval; timer->lasttime = interval; #if defined(HAVE_TIMERFD) && SW_WORKER_IPC_MODE == 1 if (swTimer_timerfd_set(timer, interval) < 0) { return SW_ERR; } timer->use_pipe = 0; #else //can not use timerfd #if SW_WORKER_IPC_MODE == 2 timer->fd = 1; #else if (swPipeNotify_auto(&timer->pipe, 0, 0) < 0) { return SW_ERR; } timer->fd = timer->pipe.getFd(&timer->pipe, 0); timer->use_pipe = 1; #endif if (swTimer_signal_set(timer, interval) < 0) { return SW_ERR; } //end #endif return SW_OK; }
int swTimer_add(swTimer *timer, int ms) { swTimer_node *node = sw_malloc(sizeof(swTimer_node)); if (node == NULL) { swWarn("swTimer_add malloc fail"); return SW_ERR; } bzero(node, sizeof(swTimer_node)); node->lasttime = swTimer_get_ms(); node->interval = ms; if(ms < timer->interval) { int new_interval = swoole_common_divisor(ms, timer->interval); timer->interval = new_interval; #if defined(HAVE_TIMERFD) && SW_WORKER_IPC_MODE == 1 swTimer_timerfd_set(timer, new_interval); #else swTimer_signal_set(timer, new_interval); #endif } swHashMap_add_int(&timer->list, ms, node); timer->num++; return SW_OK; }
static int swTimer_set(swTimer *timer, int new_interval) { if (SwooleG.use_timerfd) { return swTimer_timerfd_set(timer, new_interval); } else { return swTimer_signal_set(timer, new_interval); } }
/** * create timer */ int swTimer_create(swTimer *timer, int interval, int use_pipe) { timer->interval = interval; timer->lasttime = interval; #ifndef HAVE_TIMERFD SwooleG.use_timerfd = 0; #endif timer->list = swHashMap_new(SW_HASHMAP_INIT_BUCKET_N); if (!timer->list) { return SW_ERR; } if (SwooleG.use_timerfd) { if (swTimer_timerfd_set(timer, interval) < 0) { return SW_ERR; } timer->use_pipe = 0; } else { if (use_pipe) { if (swPipeNotify_auto(&timer->pipe, 0, 0) < 0) { return SW_ERR; } timer->fd = timer->pipe.getFd(&timer->pipe, 0); timer->use_pipe = 1; } else { timer->fd = 1; timer->use_pipe = 0; } if (swTimer_signal_set(timer, interval) < 0) { return SW_ERR; } } return SW_OK; }