Date: 2025-03-29T05:58:46+00:00

Actual source code: psleep.c

      1: #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for usleep()  */
      2: #include <petscsys.h>
      3: #if defined(PETSC_HAVE_UNISTD_H)
      4:   #include <unistd.h>
      5: #endif
      6: #if defined(PETSC_HAVE_DOS_H) /* borland */
      7:   #include <dos.h>
      8: #endif
      9: #if defined(PETSC_HAVE_TIME_H)
     10:   #include <time.h>
     11: #endif

     13: /*@
     14:   PetscSleep - Sleeps some number of seconds.

     16:   Not Collective

     18:   Input Parameter:
     19: . s - number of seconds to sleep

     21:   Level: intermediate

     23:   Note:
     24:   If `s` is negative waits for keyboard input

     26: .seealso: `PetscTime()`
     27: @*/
     28: PetscErrorCode PetscSleep(PetscReal s)
     29: {
     30:   PetscFunctionBegin;
     31:   if (s < 0) getc(stdin);

     33:   /* Some systems consider it an error to call nanosleep or usleep for more than one second so we only use them for subsecond sleeps. */
     34: #if defined(PETSC_HAVE_NANOSLEEP)
     35:   else if (s < 1) {
     36:     struct timespec rq;
     37:     rq.tv_sec  = 0;
     38:     rq.tv_nsec = (long)(s * 1e9);
     39:     nanosleep(&rq, NULL);
     40:   }
     41: #elif defined(PETSC_HAVE_USLEEP)
     42:   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
     43:   else if (s < 1) usleep((unsigned int)(s * 1e6));
     44: #endif

     46: #if defined(PETSC_HAVE_SLEEP)
     47:   else
     48:     sleep((int)s);
     49: #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
     50:   else _sleep((int)(s * 1000));
     51: #elif defined(PETSC_HAVE__SLEEP)
     52:   else _sleep((int)s);
     53: #else
     54:   SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "No support for sleep() on this machine");
     55: #endif
     56:   PetscFunctionReturn(PETSC_SUCCESS);
     57: }