ACL_EVENT *acl_event_new(int event_mode, int use_thr, int delay_sec, int delay_usec) { const char *myname = "acl_event_new"; ACL_EVENT *eventp = NULL; if (use_thr) { switch (event_mode) { case ACL_EVENT_SELECT: eventp = acl_event_new_select_thr(delay_sec, delay_usec); break; case ACL_EVENT_KERNEL: eventp = acl_event_new_kernel_thr(delay_sec, delay_usec); break; case ACL_EVENT_POLL: eventp = acl_event_new_poll_thr(delay_sec, delay_usec); break; default: acl_msg_fatal("%s(%d): unsupport %d event", myname, __LINE__, event_mode); break; } } else { switch (event_mode) { case ACL_EVENT_SELECT: eventp = acl_event_new_select(delay_sec, delay_usec); break; case ACL_EVENT_KERNEL: eventp = acl_event_new_kernel(delay_sec, delay_usec); break; case ACL_EVENT_POLL: eventp = acl_event_new_poll(delay_sec, delay_usec); break; case ACL_EVENT_WMSG: /* 使用该值作为消息号 */ eventp = acl_event_new_wmsg((unsigned int) delay_sec); break; default: acl_msg_fatal("%s(%d): unsupport %d event", myname, __LINE__, event_mode); break; } } return eventp; }
bool master_threads::run_alone(const char* addrs, const char* path /* = NULL */, unsigned int count /* = 1 */, int threads_count /* = 1 */) { // 每个进程只能有一个实例在运行 acl_assert(has_called == false); has_called = true; daemon_mode_ = false; acl_assert(addrs && *addrs); __count_limit = count; #ifdef WIN32 acl_init(); #endif std::vector<ACL_VSTREAM*> sstreams; ACL_EVENT* eventp = acl_event_new_select_thr(1, 0); set_event(eventp); // 设置基类的事件句柄 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, acl_last_serror()); acl_argv_free(tokens); close_sstreams(eventp, sstreams); acl_event_free(eventp); return false; } 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); service_init(NULL); if (threads_count > 1) { __thread_pool = acl_thread_pool_create(threads_count, 120); acl_pthread_pool_atinit(__thread_pool, thread_begin, NULL); acl_pthread_pool_atfree(__thread_pool, thread_finish, NULL); } else thread_init(NULL); while (!__stop) acl_event_loop(eventp); if (__thread_pool) acl_pthread_pool_destroy(__thread_pool); else thread_exit(NULL); service_exit(NULL); // 必须在调用 acl_event_free 前调用 close_sstreams,因为在关闭 // 网络流对象时依然有对 ACL_EVENT 引擎的使用 close_sstreams(eventp, sstreams); acl_event_free(eventp); eventp = NULL; return true; }