diff options
author | Mattes D <github@xoft.cz> | 2016-06-19 14:57:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-19 14:57:14 +0200 |
commit | 5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7 (patch) | |
tree | 083bbf9029b971dbf7b74353c9c62c22de9c78c7 /src/OSSupport/NetworkSingleton.cpp | |
parent | Merge pull request #3224 from QUSpilPrgm/master (diff) | |
parent | cNetwork: Fixed possible hang when terminating immediately after init. (diff) | |
download | cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar.gz cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar.bz2 cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar.lz cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar.xz cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.tar.zst cuberite-5ee6643804aa9cf5bc2a98b983ef7c453e78b8c7.zip |
Diffstat (limited to '')
-rw-r--r-- | src/OSSupport/NetworkSingleton.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/OSSupport/NetworkSingleton.cpp b/src/OSSupport/NetworkSingleton.cpp index c16f92c5a..d0abafcbd 100644 --- a/src/OSSupport/NetworkSingleton.cpp +++ b/src/OSSupport/NetworkSingleton.cpp @@ -6,7 +6,6 @@ #include "Globals.h" #include "NetworkSingleton.h" -#include <event2/event.h> #include <event2/thread.h> #include <event2/bufferevent.h> #include <event2/dns.h> @@ -91,8 +90,11 @@ void cNetworkSingleton::Initialise(void) } // Create the event loop thread: - m_EventLoopThread = std::thread(RunEventLoop, this); m_HasTerminated = false; + m_StartupEvent.reset(new cEvent); + m_EventLoopThread = std::thread(RunEventLoop, this); + m_StartupEvent->Wait(); // Wait for the LibEvent loop to actually start running (otherwise calling Terminate too soon would hang, see #3228) + m_StartupEvent.reset(); // Don't need the cEvent any more, release all its resources } @@ -153,6 +155,9 @@ void cNetworkSingleton::LogCallback(int a_Severity, const char * a_Msg) void cNetworkSingleton::RunEventLoop(cNetworkSingleton * a_Self) { + auto timer = evtimer_new(a_Self->m_EventBase, SignalizeStartup, a_Self); + timeval timeout{}; // Zero timeout - execute immediately + evtimer_add(timer, &timeout); event_base_loop(a_Self->m_EventBase, EVLOOP_NO_EXIT_ON_EMPTY); } @@ -160,6 +165,18 @@ void cNetworkSingleton::RunEventLoop(cNetworkSingleton * a_Self) +void cNetworkSingleton::SignalizeStartup(evutil_socket_t a_Socket, short a_Events, void * a_Self) +{ + auto self = reinterpret_cast<cNetworkSingleton *>(a_Self); + ASSERT(self != nullptr); + ASSERT(self->m_StartupEvent != nullptr); + self->m_StartupEvent->Set(); +} + + + + + void cNetworkSingleton::AddHostnameLookup(cHostnameLookupPtr a_HostnameLookup) { ASSERT(!m_HasTerminated); |