| Line | 
      Branch | 
      Exec | 
      Source | 
    
    
      | 1 | 
      
       | 
       | 
      //======================================================================== | 
    
    
      | 2 | 
      
       | 
       | 
      // GLFW 3.4 POSIX - www.glfw.org | 
    
    
      | 3 | 
      
       | 
       | 
      //------------------------------------------------------------------------ | 
    
    
      | 4 | 
      
       | 
       | 
      // Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org> | 
    
    
      | 5 | 
      
       | 
       | 
      // | 
    
    
      | 6 | 
      
       | 
       | 
      // This software is provided 'as-is', without any express or implied | 
    
    
      | 7 | 
      
       | 
       | 
      // warranty. In no event will the authors be held liable for any damages | 
    
    
      | 8 | 
      
       | 
       | 
      // arising from the use of this software. | 
    
    
      | 9 | 
      
       | 
       | 
      // | 
    
    
      | 10 | 
      
       | 
       | 
      // Permission is granted to anyone to use this software for any purpose, | 
    
    
      | 11 | 
      
       | 
       | 
      // including commercial applications, and to alter it and redistribute it | 
    
    
      | 12 | 
      
       | 
       | 
      // freely, subject to the following restrictions: | 
    
    
      | 13 | 
      
       | 
       | 
      // | 
    
    
      | 14 | 
      
       | 
       | 
      // 1. The origin of this software must not be misrepresented; you must not | 
    
    
      | 15 | 
      
       | 
       | 
      //    claim that you wrote the original software. If you use this software | 
    
    
      | 16 | 
      
       | 
       | 
      //    in a product, an acknowledgment in the product documentation would | 
    
    
      | 17 | 
      
       | 
       | 
      //    be appreciated but is not required. | 
    
    
      | 18 | 
      
       | 
       | 
      // | 
    
    
      | 19 | 
      
       | 
       | 
      // 2. Altered source versions must be plainly marked as such, and must not | 
    
    
      | 20 | 
      
       | 
       | 
      //    be misrepresented as being the original software. | 
    
    
      | 21 | 
      
       | 
       | 
      // | 
    
    
      | 22 | 
      
       | 
       | 
      // 3. This notice may not be removed or altered from any source | 
    
    
      | 23 | 
      
       | 
       | 
      //    distribution. | 
    
    
      | 24 | 
      
       | 
       | 
      // | 
    
    
      | 25 | 
      
       | 
       | 
      //======================================================================== | 
    
    
      | 26 | 
      
       | 
       | 
      // It is fine to use C99 in this file because it will not be built with VS | 
    
    
      | 27 | 
      
       | 
       | 
      //======================================================================== | 
    
    
      | 28 | 
      
       | 
       | 
       | 
    
    
      | 29 | 
      
       | 
       | 
      #define _GNU_SOURCE | 
    
    
      | 30 | 
      
       | 
       | 
       | 
    
    
      | 31 | 
      
       | 
       | 
      #include "internal.h" | 
    
    
      | 32 | 
      
       | 
       | 
       | 
    
    
      | 33 | 
      
       | 
       | 
      #include <signal.h> | 
    
    
      | 34 | 
      
       | 
       | 
      #include <time.h> | 
    
    
      | 35 | 
      
       | 
       | 
      #include <errno.h> | 
    
    
      | 36 | 
      
       | 
       | 
       | 
    
    
      | 37 | 
      
       | 
      ✗ | 
      GLFWbool _glfwPollPOSIX(struct pollfd* fds, nfds_t count, double* timeout) | 
    
    
      | 38 | 
      
       | 
       | 
      { | 
    
    
      | 39 | 
      
       | 
       | 
          for (;;) | 
    
    
      | 40 | 
      
       | 
       | 
          { | 
    
    
      | 41 | 
      
       | 
      ✗ | 
              if (timeout) | 
    
    
      | 42 | 
      
       | 
       | 
              { | 
    
    
      | 43 | 
      
       | 
      ✗ | 
                  const uint64_t base = _glfwPlatformGetTimerValue(); | 
    
    
      | 44 | 
      
       | 
       | 
       | 
    
    
      | 45 | 
      
       | 
       | 
      #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) | 
    
    
      | 46 | 
      
       | 
      ✗ | 
                  const time_t seconds = (time_t) *timeout; | 
    
    
      | 47 | 
      
       | 
      ✗ | 
                  const long nanoseconds = (long) ((*timeout - seconds) * 1e9); | 
    
    
      | 48 | 
      
       | 
      ✗ | 
                  const struct timespec ts = { seconds, nanoseconds }; | 
    
    
      | 49 | 
      
       | 
       | 
                  const int result = ppoll(fds, count, &ts, NULL); | 
    
    
      | 50 | 
      
       | 
       | 
      #elif defined(__NetBSD__) | 
    
    
      | 51 | 
      
       | 
       | 
                  const time_t seconds = (time_t) *timeout; | 
    
    
      | 52 | 
      
       | 
       | 
                  const long nanoseconds = (long) ((*timeout - seconds) * 1e9); | 
    
    
      | 53 | 
      
       | 
       | 
                  const struct timespec ts = { seconds, nanoseconds }; | 
    
    
      | 54 | 
      
       | 
       | 
                  const int result = pollts(fds, count, &ts, NULL); | 
    
    
      | 55 | 
      
       | 
       | 
      #else | 
    
    
      | 56 | 
      
       | 
       | 
                  const int milliseconds = (int) (*timeout * 1e3); | 
    
    
      | 57 | 
      
       | 
       | 
                  const int result = poll(fds, count, milliseconds); | 
    
    
      | 58 | 
      
       | 
       | 
      #endif | 
    
    
      | 59 | 
      
       | 
      ✗ | 
                  const int error = errno; // clock_gettime may overwrite our error | 
    
    
      | 60 | 
      
       | 
       | 
       | 
    
    
      | 61 | 
      
       | 
      ✗ | 
                  *timeout -= (_glfwPlatformGetTimerValue() - base) / | 
    
    
      | 62 | 
      
       | 
      ✗ | 
                      (double) _glfwPlatformGetTimerFrequency(); | 
    
    
      | 63 | 
      
       | 
       | 
       | 
    
    
      | 64 | 
      
       | 
      ✗ | 
                  if (result > 0) | 
    
    
      | 65 | 
      
       | 
      ✗ | 
                      return GLFW_TRUE; | 
    
    
      | 66 | 
      
       | 
      ✗ | 
                  else if (result == -1 && error != EINTR && error != EAGAIN) | 
    
    
      | 67 | 
      
       | 
       | 
                      return GLFW_FALSE; | 
    
    
      | 68 | 
      
       | 
      ✗ | 
                  else if (*timeout <= 0.0) | 
    
    
      | 69 | 
      
       | 
       | 
                      return GLFW_FALSE; | 
    
    
      | 70 | 
      
       | 
       | 
              } | 
    
    
      | 71 | 
      
       | 
       | 
              else | 
    
    
      | 72 | 
      
       | 
       | 
              { | 
    
    
      | 73 | 
      
       | 
       | 
                  const int result = poll(fds, count, -1); | 
    
    
      | 74 | 
      
       | 
      ✗ | 
                  if (result > 0) | 
    
    
      | 75 | 
      
       | 
       | 
                      return GLFW_TRUE; | 
    
    
      | 76 | 
      
       | 
      ✗ | 
                  else if (result == -1 && errno != EINTR && errno != EAGAIN) | 
    
    
      | 77 | 
      
       | 
       | 
                      return GLFW_FALSE; | 
    
    
      | 78 | 
      
       | 
       | 
              } | 
    
    
      | 79 | 
      
       | 
       | 
          } | 
    
    
      | 80 | 
      
       | 
       | 
      } | 
    
    
      | 81 | 
      
       | 
       | 
       | 
    
    
      | 82 | 
      
       | 
       | 
       |