xref: /petsc/src/sys/utils/psleep.c (revision c8c5c547f526914c69472d8cade615559dc64129)
1 #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for usleep()  */
2 #include <petscsys.h>                    /*I   "petscsys.h"    I*/
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
12 
13 /*@
14    PetscSleep - Sleeps some number of seconds.
15 
16    Not Collective
17 
18    Input Parameters:
19 .  s - number of seconds to sleep
20 
21    Level: intermediate
22 
23    Note:
24    If s is negative waits for keyboard input
25 
26 @*/
27 PetscErrorCode PetscSleep(PetscReal s)
28 {
29   PetscFunctionBegin;
30   if (s < 0) getc(stdin);
31 
32     /* Some systems consider it an error to call nanosleep or usleep for more than one second so we only use them for subsecond sleeps. */
33 #if defined(PETSC_HAVE_NANOSLEEP)
34   else if (s < 1) {
35     struct timespec rq;
36     rq.tv_sec  = 0;
37     rq.tv_nsec = (long)(s * 1e9);
38     nanosleep(&rq, NULL);
39   }
40 #elif defined(PETSC_HAVE_USLEEP)
41   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
42   else if (s < 1) usleep((unsigned int)(s * 1e6));
43 #endif
44 
45 #if defined(PETSC_HAVE_SLEEP)
46   else
47     sleep((int)s);
48 #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
49   else _sleep((int)(s * 1000));
50 #elif defined(PETSC_HAVE__SLEEP)
51   else _sleep((int)s);
52 #else
53   SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "No support for sleep() on this machine");
54 #endif
55   PetscFunctionReturn(PETSC_SUCCESS);
56 }
57