xref: /petsc/src/sys/utils/psleep.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 
18e5c89e4eSSatish Balay    Input Parameters:
19e5c89e4eSSatish Balay .  s - number of seconds to sleep
20e5c89e4eSSatish Balay 
21e5c89e4eSSatish Balay    Notes:
22e5c89e4eSSatish Balay       If s is negative waits for keyboard input
23e5c89e4eSSatish Balay 
24e5c89e4eSSatish Balay    Level: intermediate
25e5c89e4eSSatish Balay 
26e5c89e4eSSatish Balay @*/
27*9371c9d4SSatish Balay PetscErrorCode PetscSleep(PetscReal s) {
28e5c89e4eSSatish Balay   PetscFunctionBegin;
29e5c89e4eSSatish Balay   if (s < 0) getc(stdin);
30a6d0e24fSJed Brown 
31a6d0e24fSJed 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. */
32a6d0e24fSJed Brown #if defined(PETSC_HAVE_NANOSLEEP)
33a6d0e24fSJed Brown   else if (s < 1) {
34a6d0e24fSJed Brown     struct timespec rq;
35a6d0e24fSJed Brown     rq.tv_sec  = 0;
36a6d0e24fSJed Brown     rq.tv_nsec = (long)(s * 1e9);
3702c9f0b5SLisandro Dalcin     nanosleep(&rq, NULL);
38a6d0e24fSJed Brown   }
39a6d0e24fSJed Brown #elif defined(PETSC_HAVE_USLEEP)
40a6d0e24fSJed Brown   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
41a6d0e24fSJed Brown   else if (s < 1) usleep((unsigned int)(s * 1e6));
42a6d0e24fSJed Brown #endif
43a6d0e24fSJed Brown 
44e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SLEEP)
45*9371c9d4SSatish Balay   else
46*9371c9d4SSatish Balay     sleep((int)s);
47e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
48a6d0e24fSJed Brown   else _sleep((int)(s * 1000));
49e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP)
50a6d0e24fSJed Brown   else _sleep((int)s);
51e5c89e4eSSatish Balay #else
52fa6b8e38SSatish Balay   SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "No support for sleep() on this machine");
53e5c89e4eSSatish Balay #endif
54e5c89e4eSSatish Balay   PetscFunctionReturn(0);
55e5c89e4eSSatish Balay }
56