summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2014-10-05 19:04:30 +0200
committerMattes D <github@xoft.cz>2014-10-05 19:04:30 +0200
commitec71ffcc8015a9dccfa1d6f8dd474524412b605f (patch)
tree69b6aa06fe1bfc90822ef402d9ea145a6df14022
parentUpdated Core. (diff)
downloadcuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar.gz
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar.bz2
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar.lz
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar.xz
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.tar.zst
cuberite-ec71ffcc8015a9dccfa1d6f8dd474524412b605f.zip
-rw-r--r--src/OSSupport/Event.cpp47
-rw-r--r--src/OSSupport/Event.h4
2 files changed, 51 insertions, 0 deletions
diff --git a/src/OSSupport/Event.cpp b/src/OSSupport/Event.cpp
index 74f823216..7cf8a826c 100644
--- a/src/OSSupport/Event.cpp
+++ b/src/OSSupport/Event.cpp
@@ -102,6 +102,53 @@ void cEvent::Wait(void)
+bool cEvent::Wait(int a_TimeoutMSec)
+{
+ #ifdef _WIN32
+ DWORD res = WaitForSingleObject(m_Event, (DWORD)a_TimeoutMSec);
+ switch (res)
+ {
+ case WAIT_OBJECT_0: return true; // Regular event signalled
+ case WAIT_TIMEOUT: return false; // Regular event timeout
+ default:
+ {
+ LOGWARN("cEvent: waiting for the event failed: %u, GLE = %u. Continuing, but server may be unstable.", (unsigned)res, (unsigned)GetLastError());
+ return false;
+ }
+ }
+ #else
+ // Get the current time:
+ timespec timeout;
+ if (clock_gettime(CLOCK_REALTIME, &timeout) == -1)
+ {
+ LOGWARN("cEvent: Getting current time failed: %i, err = %s. Continuing, but the server may be unstable.", errno, GetOSErrorString(errno).c_str());
+ return false;
+ }
+
+ // Add the specified timeout:
+ timeout.tv_sec += a_TimeoutMSec / 1000;
+ timeout.tv_nsec += (a_TimeoutMSec % 1000) * 1000000; // 1 msec = 1000000 usec
+
+ // Wait with timeout:
+ int res = sem_timedwait(m_Event, &timeout);
+ switch (res)
+ {
+ case 0: return true; // Regular event signalled
+ case ETIMEDOUT: return false; // Regular even timeout
+ default:
+ {
+ AString error = GetOSErrorString(errno);
+ LOGWARN("cEvent: waiting for the event failed: %i, err = %s. Continuing, but server may be unstable.", res, error.c_str());
+ return false;
+ }
+ }
+ #endif
+}
+
+
+
+
+
void cEvent::Set(void)
{
#ifdef _WIN32
diff --git a/src/OSSupport/Event.h b/src/OSSupport/Event.h
index 71f418c0c..e2fa65a05 100644
--- a/src/OSSupport/Event.h
+++ b/src/OSSupport/Event.h
@@ -24,6 +24,10 @@ public:
void Wait(void);
void Set (void);
+
+ /** Waits for the event until either it is signalled, or the (relative) timeout is passed.
+ Returns true if the event was signalled, false if the timeout was hit or there was an error. */
+ bool Wait(int a_TimeoutMSec);
private: