xref: /petsc/src/sys/utils/psleep.c (revision 0039db0d0110a86bca704eecba868b79cf9a436a)
1*0039db0dSBarry 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    Concepts: sleeping
27e5c89e4eSSatish Balay    Concepts: pause
28e5c89e4eSSatish Balay    Concepts: waiting
29e5c89e4eSSatish Balay 
30e5c89e4eSSatish Balay @*/
317087cfbeSBarry Smith PetscErrorCode  PetscSleep(PetscReal s)
32e5c89e4eSSatish Balay {
33e5c89e4eSSatish Balay   PetscFunctionBegin;
34e5c89e4eSSatish Balay   if (s < 0) getc(stdin);
35a6d0e24fSJed Brown 
36a6d0e24fSJed 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. */
37a6d0e24fSJed Brown #if defined(PETSC_HAVE_NANOSLEEP)
38a6d0e24fSJed Brown   else if (s < 1) {
39a6d0e24fSJed Brown     struct timespec rq;
40a6d0e24fSJed Brown     rq.tv_sec  = 0;
41a6d0e24fSJed Brown     rq.tv_nsec = (long)(s*1e9);
42a6d0e24fSJed Brown     nanosleep(&rq,0);
43a6d0e24fSJed Brown   }
44a6d0e24fSJed Brown #elif defined(PETSC_HAVE_USLEEP)
45a6d0e24fSJed Brown   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
46a6d0e24fSJed Brown   else if (s < 1) usleep((unsigned int)(s*1e6));
47a6d0e24fSJed Brown #endif
48a6d0e24fSJed Brown 
49e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SLEEP)
50a6d0e24fSJed Brown   else sleep((int)s);
51e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
52a6d0e24fSJed Brown   else _sleep((int)(s*1000));
53e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__SLEEP)
54a6d0e24fSJed Brown   else _sleep((int)s);
55e5c89e4eSSatish Balay #else
56fa6b8e38SSatish Balay   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"No support for sleep() on this machine");
57e5c89e4eSSatish Balay #endif
58e5c89e4eSSatish Balay   PetscFunctionReturn(0);
59e5c89e4eSSatish Balay }
60e5c89e4eSSatish Balay 
61