bool master_aio::run_alone(const char* addrs, const char* path /* = NULL */, aio_handle_type ht /* = ENGINE_SELECT */) { acl_assert(__handle == NULL); daemon_mode_ = false; #ifdef WIN32 acl_init(); #endif std::vector<aio_listen_stream*> sstreams; ACL_ARGV* tokens = acl_argv_split(addrs, ";,| \t"); ACL_ITER iter; // 初始化配置参数 conf_.load(path); __handle = NEW aio_handle(ht); ACL_AIO* aio = __handle->get_handle(); acl_assert(aio); ACL_EVENT* eventp = acl_aio_event(aio); set_event(eventp); // 设置基类的事件句柄 acl_foreach(iter, tokens) { const char* addr = (const char*) iter.data; aio_listen_stream* sstream = NEW aio_listen_stream(__handle); // 监听指定的地址 if (sstream->open(addr) == false) { logger_error("listen %s error: %s", addr, last_serror()); close_all_listener(sstreams); // XXX: 为了保证能关闭监听流,应在此处再 check 一下 __handle->check(); acl_argv_free(tokens); return (false); } sstream->add_accept_callback(this); } acl_argv_free(tokens); service_pre_jail(NULL); service_init(NULL); while (true) { // 如果返回 false 则表示不再继续,需要退出 if (__handle->check() == false) { logger("aio_server stop now ..."); break; } } close_all_listener(sstreams); __handle->check(); service_exit(NULL); return true; }
bool master_proc::run_alone(const char* addrs, const char* path /* = NULL */, int count /* = 1 */) { // 每个进程只能有一个实例在运行 acl_assert(has_called == false); has_called = true; daemon_mode_ = false; __count_limit = count; acl_assert(addrs && *addrs); #ifdef ACL_WINDOWS acl_cpp_init(); #endif ACL_EVENT* eventp = acl_event_new_select(1, 0); set_event(eventp); // 调用基类方法设置事件引擎句柄 std::vector<ACL_VSTREAM*> sstreams; ACL_ARGV* tokens = acl_argv_split(addrs, ";,| \t"); ACL_ITER iter; acl_foreach(iter, tokens) { const char* addr = (const char*) iter.data; ACL_VSTREAM* sstream = acl_vstream_listen(addr, 128); if (sstream == NULL) { logger_error("listen %s error %s", addr, last_serror()); close_all_listener(sstreams); acl_argv_free(tokens); return false; } service_on_listen(sstream); acl_event_enable_listen(eventp, sstream, 0, listen_callback, sstream); sstreams.push_back(sstream); } acl_argv_free(tokens); // 初始化配置参数 conf_.load(path); service_pre_jail(NULL, NULL); service_init(NULL, NULL); while (!__stop) acl_event_loop(eventp); close_all_listener(sstreams); acl_event_free(eventp); service_exit(NULL, NULL); return true; }