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: }