xref: /petsc/src/sys/utils/psleep.c (revision d0e6bf2ad94dcc89b258ce16c7987200a4714786)
10039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for usleep()  */
2c6db04a5SJed Brown #include <petscsys.h>                    /*I   "petscsys.h"    I*/
3e5c89e4eSSatish Balay #if defined(PETSC_HAVE_UNISTD_H)
4e5c89e4eSSatish Balay   #include <unistd.h>
5e5c89e4eSSatish Balay #endif
6e5c89e4eSSatish Balay #if defined(PETSC_HAVE_DOS_H) /* borland */
7e5c89e4eSSatish Balay   #include <dos.h>
8e5c89e4eSSatish Balay #endif
9a6d0e24fSJed Brown #if defined(PETSC_HAVE_TIME_H)
10a6d0e24fSJed Brown   #include <time.h>
11a6d0e24fSJed Brown #endif
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay /*@
14e5c89e4eSSatish Balay   PetscSleep - Sleeps some number of seconds.
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay   Not Collective
17e5c89e4eSSatish Balay 
182fe279fdSBarry Smith   Input Parameter:
19e5c89e4eSSatish Balay . s - number of seconds to sleep
20e5c89e4eSSatish Balay 
21667f096bSBarry Smith   Level: intermediate
22667f096bSBarry Smith 
23811af0c4SBarry Smith   Note:
24*10450e9eSJacob Faibussowitsch   If `s` is negative waits for keyboard input
25e5c89e4eSSatish Balay 
26*10450e9eSJacob Faibussowitsch .seealso: `PetscTime()`
27e5c89e4eSSatish Balay @*/
PetscSleep(PetscReal s)28d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSleep(PetscReal s)
29d71ae5a4SJacob Faibussowitsch {
30e5c89e4eSSatish Balay   PetscFunctionBegin;
31e5c89e4eSSatish Balay   if (s < 0) getc(stdin);
32a6d0e24fSJed Brown 
33a6d0e24fSJed Brown   /* Some systems consider it an error to call nanosleep or usleep for more than one second so we only use them for subsecond sleeps. */
34a6d0e24fSJed Brown #if defined(PETSC_HAVE_NANOSLEEP)
35a6d0e24fSJed Brown   else if (s < 1) {
36a6d0e24fSJed Brown     struct timespec rq;
37a6d0e24fSJed Brown     rq.tv_sec  = 0;
38a6d0e24fSJed Brown     rq.tv_nsec = (long)(s * 1e9);
3902c9f0b5SLisandro Dalcin     nanosleep(&rq, NULL);
40a6d0e24fSJed Brown   }
41a6d0e24fSJed Brown #elif defined(PETSC_HAVE_USLEEP)
42a6d0e24fSJed Brown   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
43a6d0e24fSJed Brown   else if (s < 1) usleep((unsigned int)(s * 1e6));
44a6d0e24fSJed Brown #endif
45a6d0e24fSJed Brown 
46e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SLEEP)
479371c9d4SSatish Balay   else
489371c9d4SSatish Balay     sleep((int)s);
49e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
50a6d0e24fSJed Brown   else _sleep((int)(s * 1000));
51e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP)
52a6d0e24fSJed Brown   else _sleep((int)s);
53e5c89e4eSSatish Balay #else
54fa6b8e38SSatish Balay   SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "No support for sleep() on this machine");
55e5c89e4eSSatish Balay #endif
563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
57e5c89e4eSSatish Balay }
58