Beispiel #1
0
int swTask_start(swTask *task)
{
	int ret;
	ret = swReactorSelect_create(&task->reactor);
	if(ret < 0)
	{
		swTrace("create reactor fail\n");
		return ret;
	}
	if(task->factory_mode == SW_MODE_PROCESS)
	{
		ret = swFactoryProcess_create(&task->factory, task->writer_num, task->worker_num);
	}
	//default mode SW_MODE_THREAD
	else
	{
		ret = swFactoryThread_create(&task->factory, task->writer_num);
	}
	if(ret < 0)
	{
		swTrace("create factory fail\n");
		return ret;
	}
	return SW_OK;
}
Beispiel #2
0
/**
 * 使用Unix Socket通信
 */
int swFactoryProcess_writer_loop_unsock(swThreadParam *param)
{
	swFactory *factory = param->object;
	swFactoryProcess *object = factory->object;
	int pti = param->pti;
	swReactor *reactor = &(object->writers[pti].reactor);

	struct timeval tmo;
	tmo.tv_sec = 3;
	tmo.tv_usec = 0;

	reactor->factory = factory;
	reactor->id = pti;
	if (swReactorSelect_create(reactor) < 0)
	{
		swWarn("swReactorSelect_create fail\n");
		pthread_exit((void *) param);
	}
	swSingalNone();
	reactor->setHandle(reactor, SW_FD_PIPE, swFactoryProcess_writer_receive);
	reactor->wait(reactor, &tmo);
	reactor->free(reactor);
	pthread_exit((void *) param);
	return SW_OK;
}
Beispiel #3
0
int swReactor_create(swReactor *reactor, int max_event)
{
    int ret;
    bzero(reactor, sizeof(swReactor));

#ifdef HAVE_EPOLL
    ret = swReactorEpoll_create(reactor, max_event);
#elif defined(HAVE_KQUEUE)
    ret = swReactorKqueue_create(reactor, max_event);
#elif defined(HAVE_POLL)
    ret = swReactorPoll_create(reactor, max_event);
#else
    ret = swReactorSelect_create(reactor);
#endif

    reactor->running = 1;

    reactor->setHandle = swReactor_setHandle;

    reactor->onFinish = swReactor_onFinish;
    reactor->onTimeout = swReactor_onTimeout;

    reactor->write = swReactor_write;
    reactor->defer = swReactor_defer;
    reactor->close = swReactor_close;

    reactor->socket_array = swArray_new(1024, sizeof(swConnection));
    if (!reactor->socket_array)
    {
        swWarn("create socket array failed.");
        return SW_ERR;
    }

    return ret;
}
Beispiel #4
0
int swReactor_create(swReactor *reactor, int max_event)
{
    int ret;
    bzero(reactor, sizeof(swReactor));

    //event less than SW_REACTOR_MINEVENTS, use poll/select
    if (max_event <= SW_REACTOR_MINEVENTS)
    {
#ifdef SW_MAINREACTOR_USE_POLL
        ret = swReactorPoll_create(reactor, SW_REACTOR_MINEVENTS);
#else
        ret = swReactorSelect_create(reactor);
#endif
    }
    //use epoll or kqueue
    else
    {
#ifdef HAVE_EPOLL
        ret = swReactorEpoll_create(reactor, max_event);
#elif defined(HAVE_KQUEUE)
        ret = swReactorKqueue_create(reactor, max_event);
#elif defined(SW_MAINREACTOR_USE_POLL)
        ret = swReactorPoll_create(reactor, max_event);
#else
        ret = swReactorSelect_create(reactor);
#endif
    }

    reactor->running = 1;

    reactor->setHandle = swReactor_setHandle;
    reactor->onFinish = swReactor_onFinish;
    reactor->onTimeout = swReactor_onTimeout;

    reactor->write = swReactor_write;
    reactor->close = swReactor_close;

    reactor->socket_array = swArray_new(1024, sizeof(swConnection), 0);
    if (!reactor->socket_array)
    {
        swWarn("create socket array failed.");
        return SW_ERR;
    }

    return ret;
}
Beispiel #5
0
/**
 * proxy模式
 * 在单独的n个线程中接受维持TCP连接
 */
static int swServer_start_proxy(swServer *serv)
{
	int ret;
	swReactor *main_reactor = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(swReactor));
	#ifdef SW_MAINREACTOR_USE_POLL
		ret = swReactorPoll_create(main_reactor, 10);
#else
		ret = swReactorSelect_create(main_reactor);
#endif
	if (ret < 0)
	{
		swWarn("Swoole reactor create fail");
		return SW_ERR;
	}
	ret = swReactorThread_start(serv, main_reactor);
	if (ret < 0)
	{
		swWarn("Swoole poll thread start fail");
		return SW_ERR;
	}
	SwooleG.main_reactor = main_reactor;
	main_reactor->id = serv->reactor_num; //设为一个特别的ID
	main_reactor->ptr = serv;
	main_reactor->setHandle(main_reactor, SW_FD_LISTEN, swServer_master_onAccept);
	main_reactor->setHandle(main_reactor, (SW_FD_USER+2), swServer_master_onClose);

	main_reactor->onFinish = swServer_master_onReactorFinish;
	main_reactor->onTimeout = swServer_master_onReactorTimeout;

#ifdef HAVE_SIGNALFD
	if (SwooleG.use_signalfd)
	{
		swSignalfd_setup(main_reactor);
	}
#endif

	main_reactor->add(main_reactor, serv->main_pipe.getFd(&serv->main_pipe, 0), (SW_FD_USER+2));
	//no use
	//SW_START_SLEEP;
	if (serv->onStart != NULL)
	{
		serv->onStart(serv);
	}
	struct timeval tmo;
	tmo.tv_sec = SW_MAINREACTOR_TIMEO;
	tmo.tv_usec = 0;

	//先更新一次时间
	swServer_update_time();

	return main_reactor->wait(main_reactor, &tmo);
}
Beispiel #6
0
int swFactoryProcess_writer_loop(swThreadParam *param)
{
	swFactory *factory = param->object;
	swFactoryProcess *this = factory->object;
	int pti = param->pti;
	swReactor *reactor = &(this->writers[pti].reactor);

	struct timeval tmo;
	tmo.tv_sec = 3;
	tmo.tv_usec = 0;

	reactor->factory = factory;
	reactor->id = pti;
	if (swReactorSelect_create(reactor) < 0)
	{
		swTrace("swReactorSelect_create fail\n");
		pthread_exit((void *)param);
	}
	reactor->setHandle(reactor, SW_FD_CONN, swFactoryProcess_writer_receive);
	reactor->wait(reactor, &tmo);
	reactor->free(reactor);
	pthread_exit((void *)param);
	return SW_OK;
}
Beispiel #7
0
int swServer_start(swServer *serv)
{
	swReactor main_reactor;
	swFactory *factory = &serv->factory;

	struct sockaddr_in serveraddr;
	struct timeval tmo;
	int ret, step = 0;
	int option;

	ret = swServer_check_callback(serv);
	if (ret < 0)
	{
		return ret;
	}
	//run as daemon
	if(serv->daemonize > 0 )
	{
		if(daemon(1, 1) < 0)
		{
			return SW_ERR;
		}
	}
	ret = factory->start(factory);
	if (ret < 0)
	{
		return ret;
	}
	ret = swServer_poll_start(serv);
	if (ret < 0)
	{
		return ret;
	}
	bzero(&serveraddr, sizeof(struct sockaddr_in));
	//设置serveraddr
	inet_aton(serv->host, &(serveraddr.sin_addr));
	serveraddr.sin_port = htons(serv->port);
	serveraddr.sin_family = AF_INET;
	swTrace("Bind host=%s,port=%d \n", serv->host, serv->port);
	//创建监听套接字
	serv->sock = socket(PF_INET, SOCK_STREAM, 0);
	option = 1;
	setsockopt(serv->sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int));
	if (serv->sock < 0)
	{
		swTrace("[swServerCreate]create socket fail\n");
		return --step;
	}
	//将监听套接字同sockaddr绑定
	ret = bind(serv->sock, (struct sockaddr *) &serveraddr, sizeof(struct sockaddr_in));
	if (ret != 0)
	{
		swTrace("[swServerCreate]bind fail\n");
		return --step;
	}
	//开始监听套接字
	ret = listen(serv->sock, serv->backlog);
	if (ret != 0)
	{
		swTrace("[swServerCreate]listen fail\n");
		return --step;
	}
	ret = swReactorSelect_create(&main_reactor);
	if (ret < 0)
	{
		return SW_ERR;
	}
	main_reactor.ptr = serv;
	main_reactor.setHandle(&main_reactor, SW_EVENT_CLOSE, swServer_onClose);
	main_reactor.setHandle(&main_reactor, SW_EVENT_CONNECT, swServer_onAccept);
	main_reactor.add(&main_reactor, serv->event_fd, SW_EVENT_CLOSE);
	main_reactor.add(&main_reactor, serv->sock, SW_EVENT_CONNECT);

	tmo.tv_sec = 5;
	tmo.tv_usec = 0;

	serv->onStart(serv);
	main_reactor.wait(&main_reactor, &tmo);
	serv->onShutdown(serv);
	return SW_OK;
}