xref: /petsc/src/sys/utils/psleep.c (revision feff33ee0b5b037fa8f9f294dede656a2f85cc47)
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    Notes:
22       If s is negative waits for keyboard input
23 
24    Level: intermediate
25 
26    Concepts: sleeping
27    Concepts: pause
28    Concepts: waiting
29 
30 @*/
31 PetscErrorCode  PetscSleep(PetscReal s)
32 {
33   PetscFunctionBegin;
34   if (s < 0) getc(stdin);
35 
36   /* Some systems consider it an error to call nanosleep or usleep for more than one second so we only use them for subsecond sleeps. */
37 #if defined(PETSC_HAVE_NANOSLEEP)
38   else if (s < 1) {
39     struct timespec rq;
40     rq.tv_sec  = 0;
41     rq.tv_nsec = (long)(s*1e9);
42     nanosleep(&rq,0);
43   }
44 #elif defined(PETSC_HAVE_USLEEP)
45   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
46   else if (s < 1) usleep((unsigned int)(s*1e6));
47 #endif
48 
49 #if defined(PETSC_HAVE_SLEEP)
50   else sleep((int)s);
51 #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
52   else _sleep((int)(s*1000));
53 #elif defined(PETSC_HAVE__SLEEP)
54   else _sleep((int)s);
55 #else
56   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"No support for sleep() on this machine");
57 #endif
58   PetscFunctionReturn(0);
59 }
60 
61