Example #1
0
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;
}
Example #2
0
/**
 * 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;
}
Example #3
0
/**
 * 创建定时器
 */
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;
}
Example #4
0
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;
}
Example #5
0
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);
    }
}
Example #6
0
/**
 * 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;
}