int CXtReactor::SetCpuHint( int nCpus ) { if ( m_pEvtBaseCfg == NULL ) { new_event_base_cfg; if ( m_pEvtBaseCfg == NULL ) { return XT_REACT_ERR_MEM_FAIL; } } return event_config_set_num_cpus_hint( m_pEvtBaseCfg, nCpus );; }
/** Initialize the Libevent library and set up the event base. */ void tor_libevent_initialize(tor_libevent_cfg *torcfg) { tor_assert(the_event_base == NULL); /* some paths below don't use torcfg, so avoid unused variable warnings */ (void)torcfg; { int attempts = 0; struct event_config *cfg; ++attempts; cfg = event_config_new(); tor_assert(cfg); /* Telling Libevent not to try to turn locking on can avoid a needless * socketpair() attempt. */ event_config_set_flag(cfg, EVENT_BASE_FLAG_NOLOCK); if (torcfg->num_cpus > 0) event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); /* We can enable changelist support with epoll, since we don't give * Libevent any dup'd fds. This lets us avoid some syscalls. */ event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); the_event_base = event_base_new_with_config(cfg); event_config_free(cfg); } if (!the_event_base) { /* LCOV_EXCL_START */ log_err(LD_GENERAL, "Unable to initialize Libevent: cannot continue."); exit(1); // exit ok: libevent is broken. /* LCOV_EXCL_STOP */ } log_info(LD_GENERAL, "Initialized libevent version %s using method %s. Good.", event_get_version(), tor_libevent_get_method()); }
/** Initialize the Libevent library and set up the event base. */ void tor_libevent_initialize(tor_libevent_cfg *torcfg) { tor_assert(the_event_base == NULL); /* some paths below don't use torcfg, so avoid unused variable warnings */ (void)torcfg; #ifdef HAVE_EVENT2_EVENT_H { int attempts = 0; int using_threads; struct event_config *cfg; retry: ++attempts; using_threads = 0; cfg = event_config_new(); tor_assert(cfg); #if defined(_WIN32) && defined(USE_BUFFEREVENTS) if (! torcfg->disable_iocp) { evthread_use_windows_threads(); event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP); using_iocp_bufferevents = 1; using_threads = 1; } else { using_iocp_bufferevents = 0; } #elif defined(__COVERITY__) /* Avoid a 'dead code' warning below. */ using_threads = ! torcfg->disable_iocp; #endif if (!using_threads) { /* Telling Libevent not to try to turn locking on can avoid a needless * socketpair() attempt. */ event_config_set_flag(cfg, EVENT_BASE_FLAG_NOLOCK); } #if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,0,7) if (torcfg->num_cpus > 0) event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); #endif #if LIBEVENT_VERSION_NUMBER >= V(2,0,9) /* We can enable changelist support with epoll, since we don't give * Libevent any dup'd fds. This lets us avoid some syscalls. */ event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); #endif the_event_base = event_base_new_with_config(cfg); event_config_free(cfg); if (using_threads && the_event_base == NULL && attempts < 2) { /* This could be a socketpair() failure, which can happen sometimes on * windows boxes with obnoxious firewall rules. Downgrade and try * again. */ #if defined(_WIN32) && defined(USE_BUFFEREVENTS) if (torcfg->disable_iocp == 0) { log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again " "with IOCP disabled."); } else #endif { log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again."); } torcfg->disable_iocp = 1; goto retry; } } #else the_event_base = event_init(); #endif if (!the_event_base) { log_err(LD_GENERAL, "Unable to initialize Libevent: cannot continue."); exit(1); } /* Making this a NOTICE for now so we can link bugs to a libevent versions * or methods better. */ log_info(LD_GENERAL, "Initialized libevent version %s using method %s. Good.", event_get_version(), tor_libevent_get_method()); #ifdef USE_BUFFEREVENTS tor_libevent_set_tick_timeout(torcfg->msec_per_tick); #endif }
int NFCNet::InitServerNet() { int nMaxClient = mnMaxConnect; int nCpuCount = mnCpuCount; int nPort = mnPort; struct sockaddr_in sin; #if NF_PLATFORM == NF_PLATFORM_WIN WSADATA wsa_data; WSAStartup(0x0201, &wsa_data); #endif ////////////////////////////////////////////////////////////////////////// struct event_config *cfg = event_config_new(); #if NF_PLATFORM == NF_PLATFORM_WIN //event_config_avoid_method(cfg, "iocp"); //event_config_require_features(cfg, event_method_feature.EV_FEATURE_ET);//触发方式 evthread_use_windows_threads(); if(event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP) < 0) { //使用IOCP return -1; } if(event_config_set_num_cpus_hint(cfg, nCpuCount) < 0) { return -1; } base = event_base_new_with_config(cfg); #else //event_config_avoid_method(cfg, "epoll"); if(event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST) < 0) { //使用EPOLL return -1; } if(event_config_set_num_cpus_hint(cfg, nCpuCount) < 0) { return -1; } base = event_base_new_with_config(cfg);//event_base_new() #endif event_config_free(cfg); ////////////////////////////////////////////////////////////////////////// if (!base) { fprintf(stderr, "Could not initialize libevent!\n"); Final(); return -1; } //初始化时间 //gettime(base, &base->event_tv); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(nPort); printf("server started with %d\n", nPort); listener = evconnlistener_new_bind(base, listener_cb, (void *)this, LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&sin, sizeof(sin)); if (!listener) { fprintf(stderr, "Could not create a listener!\n"); Final(); return -1; } // signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)this); // // if (!signal_event || event_add(signal_event, NULL)<0) // { // fprintf(stderr, "Could not create/add a signal event!\n"); // Final(); // return -1; // } mbServer = true; event_set_log_callback(&NFCNet::log_cb); return mnMaxConnect; }
bool CNetService::Initialize( Foundation::LogService::ILog::Ptr log, unsigned int recv_size ) { DXM_COMPONENT_LOG.set_log(log); DXM_NDC("NetService::Initialize"); boost::unique_lock<boost::shared_mutex> lock(running_mutex_); if(is_running_) { DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_ERROR, "net service is initialized"); return false; } if(recv_size == 0) { DXM_COMPONENT_LOG(DXM_COMPONENT_LOG_LEVEL_ERROR, "recv_size cannot be 0" ); return false; } tls_recv_buffer_.set_default_size(recv_size); #ifdef WIN32 // wsa init WSAData wsaData; if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_ERROR, "net service initialize WSAStartup failed."); return false; } DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "wsastartup ok."); // about thread and lock evthread_use_windows_threads(); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "evthread_set ok."); // get count of processors SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "getsysteminfo ok. numberofprocessors: %u.", sysInfo.dwNumberOfProcessors); // event config ev_config_ = event_config_new(); event_config_set_flag(ev_config_, EVENT_BASE_FLAG_STARTUP_IOCP); event_config_set_num_cpus_hint(ev_config_, sysInfo.dwNumberOfProcessors); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "event_config_set ok."); #else // about thread and lock evthread_use_pthreads(); // event config ev_config_ = event_config_new(); event_config_set_flag(ev_config_, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); DXM_COMPONENT_LOG(DXM_COMPONENT_LOG_LEVEL_TRACE, "event_config_set ok."); #endif // event base ev_base_ = event_base_new_with_config(ev_config_); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "event_base_new ok."); // tv timeval tv; // ev token bucket cfg tv.tv_sec = 0; tv.tv_usec = 0; ev_t_bucket_cfg_ = ev_token_bucket_cfg_new(EV_RATE_LIMIT_MAX, EV_RATE_LIMIT_MAX, 1024, 1024, &tv); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "ev_token_bucket_cfg_new ok."); // set an event tv.tv_sec = 1; tv.tv_usec = 0; ev_ = evtimer_new(ev_base_, defaultEventFunc, this); event_add(ev_, &tv); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "event_add timer ok."); // run loop callback pthread_create(&loop_thread_, 0, loopThreadStartFunc, this); DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_TRACE, "main thread create ok."); // start is_running_ = true; DXM_COMPONENT_LOG( DXM_COMPONENT_LOG_LEVEL_INFO, "Initialize Finish."); return true; }