quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

wait.c (3056B)


      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
      9  *
     10  * This software is licensed as described in the file COPYING, which
     11  * you should have received as part of this distribution. The terms
     12  * are also available at https://curl.se/docs/copyright.html.
     13  *
     14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     15  * copies of the Software, and permit persons to whom the Software is
     16  * furnished to do so, under the terms of the COPYING file.
     17  *
     18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     19  * KIND, either express or implied.
     20  *
     21  * SPDX-License-Identifier: curl
     22  *
     23  ***************************************************************************/
     24 
     25 #include "../curl_setup.h"
     26 
     27 #ifndef HAVE_SELECT
     28 #error "We cannot compile without select() support."
     29 #endif
     30 
     31 #include <limits.h>
     32 
     33 #ifdef HAVE_SYS_SELECT_H
     34 #include <sys/select.h>
     35 #elif defined(HAVE_UNISTD_H)
     36 #include <unistd.h>
     37 #endif
     38 
     39 #ifdef MSDOS
     40 #include <dos.h>  /* delay() */
     41 #endif
     42 
     43 #include "timediff.h"
     44 #include "wait.h"
     45 
     46 /*
     47  * Internal function used for waiting a specific amount of ms in
     48  * Curl_socket_check() and Curl_poll() when no file descriptor is provided to
     49  * wait on, just being used to delay execution. Winsock select() and poll()
     50  * timeout mechanisms need a valid socket descriptor in a not null file
     51  * descriptor set to work. Waiting indefinitely with this function is not
     52  * allowed, a zero or negative timeout value will return immediately. Timeout
     53  * resolution, accuracy, as well as maximum supported value is system
     54  * dependent, neither factor is a critical issue for the intended use of this
     55  * function in the library.
     56  *
     57  * Return values:
     58  *   -1 = system call error, or invalid timeout value
     59  *    0 = specified timeout has elapsed, or interrupted
     60  */
     61 int curlx_wait_ms(timediff_t timeout_ms)
     62 {
     63   int r = 0;
     64 
     65   if(!timeout_ms)
     66     return 0;
     67   if(timeout_ms < 0) {
     68     SET_SOCKERRNO(SOCKEINVAL);
     69     return -1;
     70   }
     71 #if defined(MSDOS)
     72   delay((unsigned int)timeout_ms);
     73 #elif defined(_WIN32)
     74   /* prevent overflow, timeout_ms is typecast to ULONG/DWORD. */
     75 #if TIMEDIFF_T_MAX >= ULONG_MAX
     76   if(timeout_ms >= ULONG_MAX)
     77     timeout_ms = ULONG_MAX-1;
     78     /* do not use ULONG_MAX, because that is equal to INFINITE */
     79 #endif
     80   Sleep((DWORD)timeout_ms);
     81 #else
     82   /* avoid using poll() for this since it behaves incorrectly with no sockets
     83      on Apple operating systems */
     84   {
     85     struct timeval pending_tv;
     86     r = select(0, NULL, NULL, NULL, curlx_mstotv(&pending_tv, timeout_ms));
     87   }
     88 #endif /* _WIN32 */
     89   if(r) {
     90     if((r == -1) && (SOCKERRNO == SOCKEINTR))
     91       /* make EINTR from select or poll not a "lethal" error */
     92       r = 0;
     93     else
     94       r = -1;
     95   }
     96   return r;
     97 }