xref: /petsc/src/sys/utils/psleep.c (revision a6d0e24f942627ff06ea05f9b857f41d4f7a2353)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay 
3e5c89e4eSSatish Balay #include "petsc.h"                 /*I   "petsc.h"    I*/
4e5c89e4eSSatish Balay #if defined (PETSC_HAVE_UNISTD_H)
5e5c89e4eSSatish Balay #include <unistd.h>
6e5c89e4eSSatish Balay #endif
7e5c89e4eSSatish Balay #if defined (PETSC_HAVE_STDLIB_H)
8e5c89e4eSSatish Balay #include <stdlib.h>
9e5c89e4eSSatish Balay #endif
10e5c89e4eSSatish Balay #if defined (PETSC_HAVE_DOS_H)   /* borland */
11e5c89e4eSSatish Balay #include <dos.h>
12e5c89e4eSSatish Balay #endif
13*a6d0e24fSJed Brown #if defined (PETSC_HAVE_TIME_H)
14*a6d0e24fSJed Brown #include <time.h>
15*a6d0e24fSJed Brown #endif
16e5c89e4eSSatish Balay #include "petscfix.h"
17e5c89e4eSSatish Balay 
18e5c89e4eSSatish Balay #undef __FUNCT__
19e5c89e4eSSatish Balay #define __FUNCT__ "PetscSleep"
20e5c89e4eSSatish Balay /*@
21e5c89e4eSSatish Balay    PetscSleep - Sleeps some number of seconds.
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Not Collective
24e5c89e4eSSatish Balay 
25e5c89e4eSSatish Balay    Input Parameters:
26e5c89e4eSSatish Balay .  s - number of seconds to sleep
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay    Notes:
29e5c89e4eSSatish Balay       If s is negative waits for keyboard input
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay    Level: intermediate
32e5c89e4eSSatish Balay 
33e5c89e4eSSatish Balay    Concepts: sleeping
34e5c89e4eSSatish Balay    Concepts: pause
35e5c89e4eSSatish Balay    Concepts: waiting
36e5c89e4eSSatish Balay 
37e5c89e4eSSatish Balay @*/
38*a6d0e24fSJed Brown PetscErrorCode PETSC_DLLEXPORT PetscSleep(PetscReal s)
39e5c89e4eSSatish Balay {
40e5c89e4eSSatish Balay   PetscFunctionBegin;
41e5c89e4eSSatish Balay   if (s < 0) getc(stdin);
42*a6d0e24fSJed Brown 
43*a6d0e24fSJed 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. */
44*a6d0e24fSJed Brown #if defined (PETSC_HAVE_NANOSLEEP)
45*a6d0e24fSJed Brown   else if (s < 1) {
46*a6d0e24fSJed Brown     struct timespec rq;
47*a6d0e24fSJed Brown     rq.tv_sec = 0;
48*a6d0e24fSJed Brown     rq.tv_nsec = (long)(s*1e9);
49*a6d0e24fSJed Brown     nanosleep(&rq,0);
50*a6d0e24fSJed Brown   }
51*a6d0e24fSJed Brown #elif defined (PETSC_HAVE_USLEEP)
52*a6d0e24fSJed Brown   /* POSIX.1-2001 deprecates this in favor of nanosleep because nanosleep defines interaction with signals */
53*a6d0e24fSJed Brown   else if (s < 1) usleep((unsigned int)(s*1e6));
54*a6d0e24fSJed Brown #endif
55*a6d0e24fSJed Brown 
56e5c89e4eSSatish Balay #if defined (PETSC_HAVE_SLEEP)
57*a6d0e24fSJed Brown   else       sleep((int)s);
58e5c89e4eSSatish Balay #elif defined (PETSC_HAVE__SLEEP) && defined(PETSC_HAVE__SLEEP_MILISEC)
59*a6d0e24fSJed Brown   else       _sleep((int)(s*1000));
60e5c89e4eSSatish Balay #elif defined (PETSC_HAVE__SLEEP)
61*a6d0e24fSJed Brown   else       _sleep((int)s);
62e5c89e4eSSatish Balay #else
63b98bf947SSatish Balay   SETERRQ(PETSC_ERR_SUP_SYS,"No support for sleep() on this machine")
64e5c89e4eSSatish Balay #endif
65e5c89e4eSSatish Balay   PetscFunctionReturn(0);
66e5c89e4eSSatish Balay }
67e5c89e4eSSatish Balay 
68