run patch server on main thread on windows
This commit is contained in:
+1
-1
@@ -2361,7 +2361,7 @@ Action a_run_server_replay_log(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (evthread_use_pthreads()) {
|
if (evthread_use_pthreads()) {
|
||||||
throw runtime_error("failed to setup libevent threads");
|
throw runtime_error("failed to set up libevent threads");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isdir("system/players")) {
|
if (!isdir("system/players")) {
|
||||||
|
|||||||
+20
-6
@@ -395,17 +395,31 @@ void PatchServer::on_client_error(Channel& ch, short events) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PatchServer::PatchServer(shared_ptr<const Config> config)
|
PatchServer::PatchServer(shared_ptr<const Config> config)
|
||||||
: base(event_base_new(), event_base_free),
|
: config(config) {
|
||||||
config(config),
|
if (config->shared_base) {
|
||||||
destroy_clients_ev(event_new(this->base.get(), -1, EV_TIMEOUT, &PatchServer::dispatch_destroy_clients, this), event_free),
|
this->base = config->shared_base;
|
||||||
th(&PatchServer::thread_fn, this) {}
|
this->base_is_shared = true;
|
||||||
|
} else {
|
||||||
|
this->base.reset(event_base_new(), event_base_free);
|
||||||
|
this->base_is_shared = false;
|
||||||
|
}
|
||||||
|
this->destroy_clients_ev.reset(
|
||||||
|
event_new(this->base.get(), -1, EV_TIMEOUT, &PatchServer::dispatch_destroy_clients, this), event_free);
|
||||||
|
if (!this->base_is_shared) {
|
||||||
|
this->th = thread(&PatchServer::thread_fn, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PatchServer::schedule_stop() {
|
void PatchServer::schedule_stop() {
|
||||||
event_base_loopexit(this->base.get(), nullptr);
|
if (!this->base_is_shared) {
|
||||||
|
event_base_loopexit(this->base.get(), nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PatchServer::wait_for_stop() {
|
void PatchServer::wait_for_stop() {
|
||||||
this->th.join();
|
if (!this->base_is_shared) {
|
||||||
|
this->th.join();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PatchServer::listen(const std::string& addr_str, const string& socket_path, Version version) {
|
void PatchServer::listen(const std::string& addr_str, const string& socket_path, Version version) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public:
|
|||||||
std::string message;
|
std::string message;
|
||||||
std::shared_ptr<const LicenseIndex> license_index;
|
std::shared_ptr<const LicenseIndex> license_index;
|
||||||
std::shared_ptr<const PatchFileIndex> patch_file_index;
|
std::shared_ptr<const PatchFileIndex> patch_file_index;
|
||||||
|
std::shared_ptr<struct event_base> shared_base;
|
||||||
};
|
};
|
||||||
|
|
||||||
PatchServer() = delete;
|
PatchServer() = delete;
|
||||||
@@ -86,6 +87,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<struct event_base> base;
|
std::shared_ptr<struct event_base> base;
|
||||||
|
bool base_is_shared;
|
||||||
std::shared_ptr<const Config> config;
|
std::shared_ptr<const Config> config;
|
||||||
|
|
||||||
std::unordered_set<std::shared_ptr<Client>> clients_to_destroy;
|
std::unordered_set<std::shared_ptr<Client>> clients_to_destroy;
|
||||||
|
|||||||
@@ -1787,6 +1787,14 @@ void ServerState::load_all() {
|
|||||||
|
|
||||||
shared_ptr<PatchServer::Config> ServerState::generate_patch_server_config(bool is_bb) const {
|
shared_ptr<PatchServer::Config> ServerState::generate_patch_server_config(bool is_bb) const {
|
||||||
auto ret = make_shared<PatchServer::Config>();
|
auto ret = make_shared<PatchServer::Config>();
|
||||||
|
#ifdef PHOSG_WINDOWS
|
||||||
|
// libevent doesn't play nice with Cygwin, so we run the patch server on the
|
||||||
|
// main thread there. The problem seems to be that the locking structures are
|
||||||
|
// never set up, presumably since we call event_use_pthreads() since
|
||||||
|
// event_use_windows_threads() doesn't exist. (Does literally no one else use
|
||||||
|
// libevent with Cygwin??)
|
||||||
|
ret->shared_base = this->base;
|
||||||
|
#endif
|
||||||
ret->allow_unregistered_users = this->allow_unregistered_users;
|
ret->allow_unregistered_users = this->allow_unregistered_users;
|
||||||
ret->hide_data_from_logs = this->hide_download_commands;
|
ret->hide_data_from_logs = this->hide_download_commands;
|
||||||
ret->idle_timeout_usecs = this->patch_client_idle_timeout_usecs;
|
ret->idle_timeout_usecs = this->patch_client_idle_timeout_usecs;
|
||||||
|
|||||||
Reference in New Issue
Block a user