Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/tm/tvsleep.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
#include <tv.h>
25
#include <tm.h>
26
27
#include "FEATURE/tvlib"
28
29
#if !_lib_nanosleep
30
# if _lib_select
31
# if _sys_select
32
# include <sys/select.h>
33
# else
34
# include <sys/socket.h>
35
# endif
36
# else
37
# if !_lib_usleep
38
# if _lib_poll_notimer
39
# undef _lib_poll
40
# endif
41
# if _lib_poll
42
# include <poll.h>
43
# endif
44
# endif
45
# endif
46
#endif
47
48
/*
49
* sleep for tv
50
* non-zero exit if sleep did not complete
51
* with remaining time in rv
52
*/
53
54
int
55
tvsleep(register const Tv_t* tv, register Tv_t* rv)
56
{
57
58
#if _lib_nanosleep
59
60
struct timespec stv;
61
struct timespec srv;
62
int r;
63
64
stv.tv_sec = tv->tv_sec;
65
stv.tv_nsec = tv->tv_nsec;
66
if ((r = nanosleep(&stv, &srv)) && rv)
67
{
68
rv->tv_sec = srv.tv_sec;
69
rv->tv_nsec = srv.tv_nsec;
70
}
71
return r;
72
73
#else
74
75
#if _lib_select
76
77
struct timeval stv;
78
79
stv.tv_sec = tv->tv_sec;
80
stv.tv_usec = tv->tv_nsec / 1000;
81
if (select(0, NiL, NiL, NiL, &stv) < 0)
82
{
83
if (rv)
84
*rv = *tv;
85
return -1;
86
}
87
if (rv)
88
{
89
rv->tv_sec = stv.tv_sec;
90
rv->tv_nsec = stv.tv_usec * 1000;
91
}
92
return 0;
93
94
#else
95
96
unsigned int s = tv->tv_sec;
97
uint32_t n = tv->tv_nsec;
98
99
#if _lib_usleep
100
101
102
unsigned long t;
103
104
if (t = (n + 999L) / 1000L)
105
{
106
usleep(t);
107
s -= t / 1000000L;
108
n = 0;
109
}
110
111
#else
112
113
#if _lib_poll
114
115
struct pollfd pfd;
116
int t;
117
118
if ((t = (n + 999999L) / 1000000L) > 0)
119
{
120
poll(&pfd, 0, t);
121
s -= t / 1000L;
122
n = 0;
123
}
124
125
#endif
126
127
#endif
128
129
if ((s += (n + 999999999L) / 1000000000L) && (s = sleep(s)))
130
{
131
if (rv)
132
{
133
rv->tv_sec = s;
134
rv->tv_nsec = 0;
135
}
136
return -1;
137
}
138
return 0;
139
140
#endif
141
142
#endif
143
144
}
145
146