diff --git a/src/SFML/System/CMakeLists.txt b/src/SFML/System/CMakeLists.txt index 0c62aa12..493823ab 100644 --- a/src/SFML/System/CMakeLists.txt +++ b/src/SFML/System/CMakeLists.txt @@ -77,6 +77,9 @@ endif() if(LINUX) set(SYSTEM_EXT_LIBS ${SYSTEM_EXT_LIBS} rt) endif() +if(WINDOWS) + set(SYSTEM_EXT_LIBS ${SYSTEM_EXT_LIBS} winmm) +endif() # define the sfml-system target sfml_add_library(sfml-system diff --git a/src/SFML/System/Unix/SleepImpl.cpp b/src/SFML/System/Unix/SleepImpl.cpp index d817d584..96d6ba3c 100644 --- a/src/SFML/System/Unix/SleepImpl.cpp +++ b/src/SFML/System/Unix/SleepImpl.cpp @@ -26,9 +26,8 @@ // Headers //////////////////////////////////////////////////////////// #include -#include -#include -#include +#include +#include namespace sf @@ -38,38 +37,21 @@ namespace priv //////////////////////////////////////////////////////////// void sleepImpl(Time time) { - // usleep is not reliable enough (it might block the - // whole process instead of just the current thread) - // so we must use pthread_cond_timedwait instead - - // this implementation is inspired from Qt - Uint64 usecs = time.asMicroseconds(); - // get the current time - timeval tv; - gettimeofday(&tv, NULL); - - // construct the time limit (current time + time to wait) + // Construct the time to wait timespec ti; - ti.tv_nsec = (tv.tv_usec + (usecs % 1000000)) * 1000; - ti.tv_sec = tv.tv_sec + (usecs / 1000000) + (ti.tv_nsec / 1000000000); - ti.tv_nsec %= 1000000000; + ti.tv_nsec = (usecs % 1000000) * 1000; + ti.tv_sec = usecs / 1000000; - // create a mutex and thread condition - pthread_mutex_t mutex; - pthread_mutex_init(&mutex, 0); - pthread_cond_t condition; - pthread_cond_init(&condition, 0); - - // wait... - pthread_mutex_lock(&mutex); - pthread_cond_timedwait(&condition, &mutex, &ti); - pthread_mutex_unlock(&mutex); - - // destroy the mutex and condition - pthread_cond_destroy(&condition); - pthread_mutex_destroy(&mutex); + // Wait... + // If nanosleep returns -1, we check errno. If it is EINTR + // nanosleep was interrupted and has set ti to the remaining + // duration. We continue sleeping until the complete duration + // has passed. We stop sleeping if it was due to an error. + while ((nanosleep(&ti, &ti) == -1) && (errno == EINTR)) + { + } } } // namespace priv diff --git a/src/SFML/System/Win32/SleepImpl.cpp b/src/SFML/System/Win32/SleepImpl.cpp index c3acda63..b031403e 100644 --- a/src/SFML/System/Win32/SleepImpl.cpp +++ b/src/SFML/System/Win32/SleepImpl.cpp @@ -36,7 +36,18 @@ namespace priv //////////////////////////////////////////////////////////// void sleepImpl(Time time) { + // Get the supported timer resolutions on this system + TIMECAPS tc; + timeGetDevCaps(&tc, sizeof(TIMECAPS)); + + // Set the timer resolution to the minimum for the Sleep call + timeBeginPeriod(tc.wPeriodMin); + + // Wait... ::Sleep(time.asMilliseconds()); + + // Reset the timer resolution back to the system default + timeEndPeriod(tc.wPeriodMin); } } // namespace priv