]> git.lizzy.rs Git - minetest.git/blobdiff - src/threading/semaphore.cpp
Add keybind to swap items between hands
[minetest.git] / src / threading / semaphore.cpp
index 00332eaa03dc0f540578f86d51523a3296fdad94..ce22dcd05d46eeb95cdde7b5c70c09956c32426e 100644 (file)
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define UNUSED(expr) do { (void)(expr); } while (0)
 
 #ifdef _WIN32
+       #include <climits>
        #define MAX_SEMAPHORE_COUNT LONG_MAX - 1
 #else
        #include <cerrno>
@@ -139,22 +140,27 @@ bool Semaphore::wait(unsigned int time_ms)
                        errno = EINVAL;
        }
 # else
-       struct timespec wait_time;
-       struct timeval now;
+       int ret;
+       if (time_ms > 0) {
+               struct timespec wait_time;
+               struct timeval now;
 
-       if (gettimeofday(&now, NULL) == -1) {
-               std::cerr << "Semaphore::wait(ms): Unable to get time with gettimeofday!" << std::endl;
-               abort();
-       }
+               if (gettimeofday(&now, NULL) == -1) {
+                       std::cerr << "Semaphore::wait(ms): Unable to get time with gettimeofday!" << std::endl;
+                       abort();
+               }
 
-       wait_time.tv_nsec = ((time_ms % 1000) * 1000 * 1000) + (now.tv_usec * 1000);
-       wait_time.tv_sec  = (time_ms / 1000) + (wait_time.tv_nsec / (1000 * 1000 * 1000)) + now.tv_sec;
-       wait_time.tv_nsec %= 1000 * 1000 * 1000;
+               wait_time.tv_nsec = ((time_ms % 1000) * 1000 * 1000) + (now.tv_usec * 1000);
+               wait_time.tv_sec  = (time_ms / 1000) + (wait_time.tv_nsec / (1000 * 1000 * 1000)) + now.tv_sec;
+               wait_time.tv_nsec %= 1000 * 1000 * 1000;
 
-       int ret = sem_timedwait(&semaphore, &wait_time);
+               ret = sem_timedwait(&semaphore, &wait_time);
+       } else {
+               ret = sem_trywait(&semaphore);
+       }
 # endif
 
-       assert(!ret || (errno == ETIMEDOUT || errno == EINTR));
+       assert(!ret || (errno == ETIMEDOUT || errno == EINTR || errno == EAGAIN));
        return !ret;
 #endif
 }