示例#1
0
swChannel* swChannel_create(int size, int maxlen, int flag)
{
	assert(size > SW_CHANNEL_MIN_MEM + maxlen);
	int ret;
	void *mem;

	//是否使用共享内存
	if (flag & SW_CHAN_SHM)
	{
		mem = sw_shm_malloc(size);
	}
	else
	{
		mem = sw_malloc(size);
	}

	if (mem == NULL)
	{
		swWarn("swChannel_create: malloc fail");
		return NULL;
	}
	swChannel *object = mem;
	mem += sizeof(swChannel);

	bzero(object, sizeof(swChannel));

	//允许溢出
	object->size = size - maxlen;
	object->mem = mem;
	object->maxlen = maxlen;
	object->flag = flag;

	//是否启用锁
	if (flag & SW_CHAN_LOCK)
	{
		//初始化锁
		if (swMutex_create(&object->lock, 1) < 0)
		{
			swWarn("mutex init fail\n");
			return NULL;
		}
	}
	//初始化通知系统
	if (flag & SW_CHAN_NOTIFY)
	{
#ifdef HAVE_EVENTFD
		ret = swPipeEventfd_create(&object->notify_fd, 1, 1);
#else
		ret = swPipeBase_create(&object->notify_fd, 1);
#endif
		if (ret < 0)
		{
			swWarn("notify_fd init fail\n");
			return NULL;
		}
	}
	return object;
}
示例#2
0
文件: Base.c 项目: GitHublong/swoole
int swPipeNotify_auto(swPipe *p, int blocking, int semaphore)
{
	//eventfd是2.6.26提供的,timerfd是2.6.27提供的
#ifdef HAVE_EVENTFD
	return swPipeEventfd_create(p, blocking, semaphore);
#else
	return swPipeBase_create(p, blocking);
#endif
}
示例#3
0
int swFactoryThread_start(swFactory *factory)
{
	swFactoryThread *this = factory->object;
	swThreadParam *param;
	int i;
	int ret;
	pthread_t pidt;

	ret = swFactory_check_callback(factory);
	if (ret < 0)
	{
		return SW_ERR;
	}
	for (i = 0; i < this->writer_num; i++)
	{
#ifdef HAVE_EVENTFD
		ret = swPipeEventfd_create(&this->writers[i].evfd, 1, 1);
#else
		ret = swPipeBase_create(&this->writers[i].evfd, 1);
#endif
		if (ret < 0)
		{
			swTrace("create eventfd fail\n");
			return SW_ERR;
		}
		param = sw_malloc(sizeof(swThreadParam));
		if (param == NULL)
		{
			return SW_ERR;
		}
		param->object = factory;
		param->pti = i;
		if (pthread_create(&pidt, NULL, (void * (*)(void *)) swFactoryThread_writer_loop, (void *) param) < 0)
		{
			swTrace("pthread_create fail\n");
			return SW_ERR;
		}
		if (swRingQueue_init(&this->queues[i], SW_RINGQUEUE_LEN) < 0)
		{
			swTrace("create ring queue fail\n");
			return SW_ERR;
		}
		this->writers[i].ptid = pidt;
		//SW_START_SLEEP;
	}
	return SW_OK;
}
示例#4
0
文件: Chan.c 项目: Aaron-Teng/swoole
/**
 * @elem_size 每个item内存块的长度
 * @elem_max item最多个数
 */
int swChan_create(swChan **chan_addr, void *mem, int mem_size, int elem_max, int elem_size)
{
	int slab_size, ret;
	bzero(mem, sizeof(swChan)); //初始化内存块
	if (mem_size <= 0 || mem == NULL || mem_size < SW_CHAN_MIN_MEM)
	{
		swWarn("error: mem_size <= %d or mem == NULL\n", SW_CHAN_MIN_MEM);
		return SW_ERR;
	}
	*chan_addr = mem;
	swChan *chan = *chan_addr;
	mem += sizeof(swChan); //去掉swChan结构占用的部分
	if (swMutex_create(&chan->lock, 1) < 0)
	{
		swWarn("create mutex fail.\n");
		return SW_ERR;
	}
	if (elem_max == 0)
	{
		elem_max = 65535;
	}
#ifdef HAVE_EVENTFD
	ret =  swPipeEventfd_create(&chan->notify_fd, 1, 1);
#else
	ret =  swPipeBase_create(&chan->notify_fd, 1);
#endif
	if(ret < 0)
	{
		swWarn("create eventfd fail.\n");
		return SW_ERR;
	}
	slab_size = sizeof(swChanElem)*elem_max;
	chan->elem_max = elem_max;
	chan->mem_size = mem_size - slab_size - sizeof(swChan);//允许溢出
	chan->elems = (swChanElem *) mem;
	chan->mem = mem + slab_size;
	swMemPool_create(&chan->pool, chan->mem, chan->mem_size, elem_size);
	return SW_OK;
}
示例#5
0
文件: timer.c 项目: freeliver/swoole
int swTimer_start(swTimer *timer, int interval_ms)
{
	struct timeval now;
	if (gettimeofday(&now, NULL) < 0)
	{
		swWarn("malloc fail\n");
		return SW_ERR;
	}
	timer->interval_ms = interval_ms;
	timer->lasttime = interval_ms;

	int sec = interval_ms / 1000;
	int msec = (((float) interval_ms / 1000) - sec) * 1000;
#ifdef HAVE_TIMERFD
	struct itimerspec timer_set;
	memset(&timer_set, 0, sizeof(timer_set));
	timer->fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC);
	if (timer->fd < 0)
	{
		swError("create timerfd fail\n");
		return SW_ERR;
	}
	timer_set.it_value.tv_sec = now.tv_sec + sec;
	timer_set.it_value.tv_nsec = now.tv_usec + msec * 1000;
	timer_set.it_interval.tv_sec = sec;
	timer_set.it_interval.tv_nsec = msec * 1000 * 1000;
	if (timerfd_settime(timer->fd, TFD_TIMER_ABSTIME, &timer_set, NULL) == -1)
	{
		swWarn("set timer fail\n");
		return SW_ERR;
	}
	timer->use_pipe = 0;
#else
	struct itimerval timer_set;
	int ret;
	//eventfd是2.6.26提供的,timerfd是2.6.27提供的
#ifdef HAVE_EVENTFD
	ret = swPipeEventfd_create(&timer->pipe, 0, 0);
#else
	ret = swPipeBase_create(&timer->pipe, 0);
#endif
	if (ret < 0)
	{
		swWarn("create timer pipe fail");
		return SW_ERR;
	}
	memset(&timer_set, 0, sizeof(timer_set));
	timer_set.it_value.tv_sec = sec;
	timer_set.it_value.tv_usec = msec * 1000;
	timer_set.it_interval.tv_sec = sec;
	timer_set.it_interval.tv_usec = msec * 1000;
	if (setitimer(ITIMER_REAL, &timer_set, NULL) < 0)
	{
		swWarn("set timer fail");
		return SW_ERR;
	}
	timer->fd = timer->pipe.getFd(&timer->pipe, 0);
	timer->use_pipe = 1;
#endif
	return SW_OK;
}