blob: 4c940c98f125e8d4567c25a10d1a1e260a9eb683 [file] [log] [blame]
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +00001#include "Python.h"
Victor Stinner09225b72012-02-07 23:41:01 +01002#ifdef MS_WINDOWS
3#include <windows.h>
4#endif
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +00005
Victor Stinnerae586492014-09-02 23:18:25 +02006#if defined(__APPLE__)
7#include <mach/mach_time.h> /* mach_absolute_time(), mach_timebase_info() */
8#endif
9
Victor Stinnercb29f012015-03-27 13:31:18 +010010/* To millisecond (10^-3) */
Victor Stinner580ef132015-03-20 01:55:04 +010011#define SEC_TO_MS 1000
Victor Stinner580ef132015-03-20 01:55:04 +010012
Victor Stinnercb29f012015-03-27 13:31:18 +010013/* To microseconds (10^-6) */
14#define MS_TO_US 1000
Victor Stinner580ef132015-03-20 01:55:04 +010015#define SEC_TO_US (SEC_TO_MS * MS_TO_US)
16
Victor Stinnercb29f012015-03-27 13:31:18 +010017/* To nanoseconds (10^-9) */
18#define US_TO_NS 1000
19#define MS_TO_NS (MS_TO_US * US_TO_NS)
20#define SEC_TO_NS (SEC_TO_MS * MS_TO_NS)
21
Victor Stinner62d1c702015-04-01 17:47:07 +020022/* Conversion from nanoseconds */
23#define NS_TO_MS (1000 * 1000)
24#define NS_TO_US (1000)
25
Victor Stinner5d272cc2012-03-13 13:35:55 +010026static void
27error_time_t_overflow(void)
Victor Stinner643cd682012-03-02 22:54:03 +010028{
Victor Stinner5d272cc2012-03-13 13:35:55 +010029 PyErr_SetString(PyExc_OverflowError,
30 "timestamp out of range for platform time_t");
31}
32
Larry Hastings76ad59b2012-05-03 00:30:07 -070033time_t
Victor Stinner5d272cc2012-03-13 13:35:55 +010034_PyLong_AsTime_t(PyObject *obj)
35{
36#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
37 PY_LONG_LONG val;
38 val = PyLong_AsLongLong(obj);
39#else
40 long val;
41 assert(sizeof(time_t) <= sizeof(long));
42 val = PyLong_AsLong(obj);
43#endif
44 if (val == -1 && PyErr_Occurred()) {
45 if (PyErr_ExceptionMatches(PyExc_OverflowError))
46 error_time_t_overflow();
47 return -1;
48 }
49 return (time_t)val;
50}
51
Larry Hastings6fe20b32012-04-19 15:07:49 -070052PyObject *
53_PyLong_FromTime_t(time_t t)
54{
55#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
56 return PyLong_FromLongLong((PY_LONG_LONG)t);
57#else
58 assert(sizeof(time_t) <= sizeof(long));
59 return PyLong_FromLong((long)t);
60#endif
61}
62
Victor Stinnerce6aa742015-09-09 22:28:09 +020063/* Round to nearest with ties going to nearest even integer
64 (_PyTime_ROUND_HALF_EVEN) */
65static double
Victor Stinner7667f582015-09-09 01:02:23 +020066_PyTime_RoundHalfEven(double x)
Victor Stinner74474232015-09-02 01:43:56 +020067{
Victor Stinner7667f582015-09-09 01:02:23 +020068 double rounded = round(x);
69 if (fabs(x-rounded) == 0.5)
70 /* halfway case: round to even */
71 rounded = 2.0*round(x/2.0);
72 return rounded;
Victor Stinner74474232015-09-02 01:43:56 +020073}
74
Victor Stinner9ae47df2015-09-09 22:28:58 +020075static double
76_PyTime_Round(double x, _PyTime_round_t round)
77{
78 if (round == _PyTime_ROUND_HALF_EVEN)
79 return _PyTime_RoundHalfEven(x);
80 else if (round == _PyTime_ROUND_CEILING)
81 return ceil(x);
82 else
83 return floor(x);
84}
85
Victor Stinner5d272cc2012-03-13 13:35:55 +010086static int
Victor Stinner53e137c2015-09-02 00:49:16 +020087_PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
88 double denominator, _PyTime_round_t round)
89{
90 double intpart, err;
Victor Stinner24b822e2015-09-02 11:58:56 +020091 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner53e137c2015-09-02 00:49:16 +020092 volatile double floatpart;
93
94 floatpart = modf(d, &intpart);
Victor Stinner53e137c2015-09-02 00:49:16 +020095
96 floatpart *= denominator;
Victor Stinner9ae47df2015-09-09 22:28:58 +020097 floatpart = _PyTime_Round(floatpart, round);
Victor Stinner67edcc92015-09-02 10:37:46 +020098 if (floatpart >= denominator) {
99 floatpart -= denominator;
100 intpart += 1.0;
Victor Stinner53e137c2015-09-02 00:49:16 +0200101 }
Victor Stinneradfefa52015-09-04 23:57:25 +0200102 else if (floatpart < 0) {
103 floatpart += denominator;
104 intpart -= 1.0;
105 }
Victor Stinner67edcc92015-09-02 10:37:46 +0200106 assert(0.0 <= floatpart && floatpart < denominator);
Victor Stinner53e137c2015-09-02 00:49:16 +0200107
108 *sec = (time_t)intpart;
Victor Stinner67edcc92015-09-02 10:37:46 +0200109 *numerator = (long)floatpart;
110
Victor Stinner53e137c2015-09-02 00:49:16 +0200111 err = intpart - (double)*sec;
112 if (err <= -1.0 || err >= 1.0) {
113 error_time_t_overflow();
114 return -1;
115 }
Victor Stinner53e137c2015-09-02 00:49:16 +0200116 return 0;
117}
118
119static int
Victor Stinner5d272cc2012-03-13 13:35:55 +0100120_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
Victor Stinner3c1b3792014-02-17 00:02:43 +0100121 double denominator, _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100122{
Victor Stinnerbbdda212015-09-02 00:50:43 +0200123 assert(denominator <= (double)LONG_MAX);
124
Victor Stinner643cd682012-03-02 22:54:03 +0100125 if (PyFloat_Check(obj)) {
Victor Stinner53e137c2015-09-02 00:49:16 +0200126 double d = PyFloat_AsDouble(obj);
127 return _PyTime_DoubleToDenominator(d, sec, numerator,
128 denominator, round);
Victor Stinner643cd682012-03-02 22:54:03 +0100129 }
130 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100131 *sec = _PyLong_AsTime_t(obj);
Victor Stinner67edcc92015-09-02 10:37:46 +0200132 *numerator = 0;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100133 if (*sec == (time_t)-1 && PyErr_Occurred())
134 return -1;
Victor Stinner643cd682012-03-02 22:54:03 +0100135 return 0;
136 }
Victor Stinner5d272cc2012-03-13 13:35:55 +0100137}
Victor Stinner643cd682012-03-02 22:54:03 +0100138
Victor Stinner5d272cc2012-03-13 13:35:55 +0100139int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100140_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100141{
142 if (PyFloat_Check(obj)) {
Victor Stinner5786aef2015-09-03 16:33:16 +0200143 double intpart, err;
Victor Stinner24b822e2015-09-02 11:58:56 +0200144 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner5786aef2015-09-03 16:33:16 +0200145 volatile double d;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100146
Victor Stinner5d272cc2012-03-13 13:35:55 +0100147 d = PyFloat_AsDouble(obj);
Victor Stinner9ae47df2015-09-09 22:28:58 +0200148 d = _PyTime_Round(d, round);
Victor Stinner5d272cc2012-03-13 13:35:55 +0100149 (void)modf(d, &intpart);
150
151 *sec = (time_t)intpart;
152 err = intpart - (double)*sec;
153 if (err <= -1.0 || err >= 1.0) {
154 error_time_t_overflow();
155 return -1;
156 }
157 return 0;
158 }
159 else {
160 *sec = _PyLong_AsTime_t(obj);
161 if (*sec == (time_t)-1 && PyErr_Occurred())
162 return -1;
163 return 0;
164 }
165}
166
167int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100168_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec,
169 _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100170{
Victor Stinnerbbdda212015-09-02 00:50:43 +0200171 int res;
172 res = _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
Victor Stinner67edcc92015-09-02 10:37:46 +0200173 assert(0 <= *nsec && *nsec < SEC_TO_NS);
Victor Stinnerbbdda212015-09-02 00:50:43 +0200174 return res;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100175}
176
177int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100178_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec,
179 _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100180{
Victor Stinnerbbdda212015-09-02 00:50:43 +0200181 int res;
182 res = _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
Victor Stinner67edcc92015-09-02 10:37:46 +0200183 assert(0 <= *usec && *usec < SEC_TO_US);
Victor Stinnerbbdda212015-09-02 00:50:43 +0200184 return res;
Victor Stinner643cd682012-03-02 22:54:03 +0100185}
186
Victor Stinnercb29f012015-03-27 13:31:18 +0100187static void
188_PyTime_overflow(void)
189{
190 PyErr_SetString(PyExc_OverflowError,
191 "timestamp too large to convert to C _PyTime_t");
192}
193
Victor Stinner4bfb4602015-03-27 22:27:24 +0100194_PyTime_t
Victor Stinner13019fd2015-04-03 13:10:54 +0200195_PyTime_FromSeconds(int seconds)
196{
197 _PyTime_t t;
Victor Stinnerbbdda212015-09-02 00:50:43 +0200198 t = (_PyTime_t)seconds;
Victor Stinner13019fd2015-04-03 13:10:54 +0200199 /* ensure that integer overflow cannot happen, int type should have 32
200 bits, whereas _PyTime_t type has at least 64 bits (SEC_TO_MS takes 30
201 bits). */
Victor Stinnerbbdda212015-09-02 00:50:43 +0200202 assert((t >= 0 && t <= _PyTime_MAX / SEC_TO_NS)
203 || (t < 0 && t >= _PyTime_MIN / SEC_TO_NS));
204 t *= SEC_TO_NS;
Victor Stinner13019fd2015-04-03 13:10:54 +0200205 return t;
206}
207
208_PyTime_t
Victor Stinner4bfb4602015-03-27 22:27:24 +0100209_PyTime_FromNanoseconds(PY_LONG_LONG ns)
210{
211 _PyTime_t t;
212 assert(sizeof(PY_LONG_LONG) <= sizeof(_PyTime_t));
213 t = Py_SAFE_DOWNCAST(ns, PY_LONG_LONG, _PyTime_t);
214 return t;
215}
216
Victor Stinnera47b8812015-03-27 18:16:17 +0100217#ifdef HAVE_CLOCK_GETTIME
Victor Stinnercb29f012015-03-27 13:31:18 +0100218static int
Victor Stinnercb0c6022015-03-28 05:24:19 +0100219_PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts, int raise)
Victor Stinnercb29f012015-03-27 13:31:18 +0100220{
221 _PyTime_t t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100222 int res = 0;
223
Victor Stinnercb29f012015-03-27 13:31:18 +0100224 t = (_PyTime_t)ts->tv_sec * SEC_TO_NS;
225 if (t / SEC_TO_NS != ts->tv_sec) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100226 if (raise)
227 _PyTime_overflow();
228 res = -1;
Victor Stinnercb29f012015-03-27 13:31:18 +0100229 }
230
231 t += ts->tv_nsec;
232
233 *tp = t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100234 return res;
Victor Stinnercb29f012015-03-27 13:31:18 +0100235}
Victor Stinner1bd18ba2015-03-30 00:25:38 +0200236#elif !defined(MS_WINDOWS)
Victor Stinnera47b8812015-03-27 18:16:17 +0100237static int
Victor Stinnercb0c6022015-03-28 05:24:19 +0100238_PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv, int raise)
Victor Stinnera47b8812015-03-27 18:16:17 +0100239{
240 _PyTime_t t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100241 int res = 0;
Victor Stinnera47b8812015-03-27 18:16:17 +0100242
243 t = (_PyTime_t)tv->tv_sec * SEC_TO_NS;
244 if (t / SEC_TO_NS != tv->tv_sec) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100245 if (raise)
246 _PyTime_overflow();
247 res = -1;
Victor Stinnera47b8812015-03-27 18:16:17 +0100248 }
249
250 t += (_PyTime_t)tv->tv_usec * US_TO_NS;
251
252 *tp = t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100253 return res;
Victor Stinnera47b8812015-03-27 18:16:17 +0100254}
Victor Stinnercb29f012015-03-27 13:31:18 +0100255#endif
256
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200257static int
Victor Stinner53e137c2015-09-02 00:49:16 +0200258_PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
Victor Stinner9ae47df2015-09-09 22:28:58 +0200259 long unit_to_ns)
Victor Stinner53e137c2015-09-02 00:49:16 +0200260{
Victor Stinner5786aef2015-09-03 16:33:16 +0200261 double err;
Victor Stinner24b822e2015-09-02 11:58:56 +0200262 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner5786aef2015-09-03 16:33:16 +0200263 volatile double d;
Victor Stinner53e137c2015-09-02 00:49:16 +0200264
265 /* convert to a number of nanoseconds */
266 d = value;
Victor Stinner9ae47df2015-09-09 22:28:58 +0200267 d *= (double)unit_to_ns;
268 d = _PyTime_Round(d, round);
Victor Stinner53e137c2015-09-02 00:49:16 +0200269
270 *t = (_PyTime_t)d;
271 err = d - (double)*t;
272 if (fabs(err) >= 1.0) {
273 _PyTime_overflow();
274 return -1;
275 }
276 return 0;
277}
278
279static int
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200280_PyTime_FromObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round,
Victor Stinner9ae47df2015-09-09 22:28:58 +0200281 long unit_to_ns)
Victor Stinnercb29f012015-03-27 13:31:18 +0100282{
283 if (PyFloat_Check(obj)) {
Victor Stinner53e137c2015-09-02 00:49:16 +0200284 double d;
Victor Stinnercb29f012015-03-27 13:31:18 +0100285 d = PyFloat_AsDouble(obj);
Victor Stinner9ae47df2015-09-09 22:28:58 +0200286 return _PyTime_FromFloatObject(t, d, round, unit_to_ns);
Victor Stinnercb29f012015-03-27 13:31:18 +0100287 }
288 else {
289#ifdef HAVE_LONG_LONG
290 PY_LONG_LONG sec;
291 sec = PyLong_AsLongLong(obj);
292 assert(sizeof(PY_LONG_LONG) <= sizeof(_PyTime_t));
293#else
294 long sec;
295 sec = PyLong_AsLong(obj);
296 assert(sizeof(PY_LONG_LONG) <= sizeof(_PyTime_t));
297#endif
298 if (sec == -1 && PyErr_Occurred()) {
299 if (PyErr_ExceptionMatches(PyExc_OverflowError))
300 _PyTime_overflow();
301 return -1;
302 }
Victor Stinner9ae47df2015-09-09 22:28:58 +0200303 *t = sec * unit_to_ns;
304 if (*t / unit_to_ns != sec) {
Victor Stinnercb29f012015-03-27 13:31:18 +0100305 _PyTime_overflow();
306 return -1;
307 }
308 return 0;
309 }
310}
311
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200312int
313_PyTime_FromSecondsObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round)
314{
315 return _PyTime_FromObject(t, obj, round, SEC_TO_NS);
316}
317
318int
319_PyTime_FromMillisecondsObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round)
320{
321 return _PyTime_FromObject(t, obj, round, MS_TO_NS);
322}
323
Victor Stinner4bfb4602015-03-27 22:27:24 +0100324double
325_PyTime_AsSecondsDouble(_PyTime_t t)
326{
Victor Stinner3e2c8d82015-09-09 22:32:48 +0200327 if (t % SEC_TO_NS == 0) {
328 _PyTime_t secs;
329 /* Divide using integers to avoid rounding issues on the integer part.
330 1e-9 cannot be stored exactly in IEEE 64-bit. */
331 secs = t / SEC_TO_NS;
332 return (double)secs;
333 }
334 else {
335 return (double)t / 1e9;
336 }
Victor Stinner4bfb4602015-03-27 22:27:24 +0100337}
338
Victor Stinner992c43f2015-03-27 17:12:45 +0100339PyObject *
340_PyTime_AsNanosecondsObject(_PyTime_t t)
341{
342#ifdef HAVE_LONG_LONG
343 assert(sizeof(PY_LONG_LONG) >= sizeof(_PyTime_t));
344 return PyLong_FromLongLong((PY_LONG_LONG)t);
345#else
346 assert(sizeof(long) >= sizeof(_PyTime_t));
347 return PyLong_FromLong((long)t);
348#endif
349}
350
Victor Stinnercb29f012015-03-27 13:31:18 +0100351static _PyTime_t
Victor Stinner7667f582015-09-09 01:02:23 +0200352_PyTime_Divide(const _PyTime_t t, const _PyTime_t k,
353 const _PyTime_round_t round)
Victor Stinnercb29f012015-03-27 13:31:18 +0100354{
Victor Stinner62d1c702015-04-01 17:47:07 +0200355 assert(k > 1);
Victor Stinner7667f582015-09-09 01:02:23 +0200356 if (round == _PyTime_ROUND_HALF_EVEN) {
357 _PyTime_t x, r, abs_r;
Victor Stinner74474232015-09-02 01:43:56 +0200358 x = t / k;
359 r = t % k;
Victor Stinner7667f582015-09-09 01:02:23 +0200360 abs_r = Py_ABS(r);
361 if (abs_r > k / 2 || (abs_r == k / 2 && (Py_ABS(x) & 1))) {
Victor Stinner74474232015-09-02 01:43:56 +0200362 if (t >= 0)
363 x++;
364 else
365 x--;
366 }
367 return x;
368 }
369 else if (round == _PyTime_ROUND_CEILING) {
Victor Stinner62d1c702015-04-01 17:47:07 +0200370 if (t >= 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100371 return (t + k - 1) / k;
372 else
Victor Stinner7667f582015-09-09 01:02:23 +0200373 return t / k;
374 }
375 else {
376 if (t >= 0)
377 return t / k;
378 else
Victor Stinner62d1c702015-04-01 17:47:07 +0200379 return (t - (k - 1)) / k;
Victor Stinnercb29f012015-03-27 13:31:18 +0100380 }
Victor Stinnercb29f012015-03-27 13:31:18 +0100381}
382
383_PyTime_t
384_PyTime_AsMilliseconds(_PyTime_t t, _PyTime_round_t round)
385{
Victor Stinner62d1c702015-04-01 17:47:07 +0200386 return _PyTime_Divide(t, NS_TO_MS, round);
Victor Stinnercb29f012015-03-27 13:31:18 +0100387}
388
Victor Stinnerf5faad22015-03-28 03:52:05 +0100389_PyTime_t
390_PyTime_AsMicroseconds(_PyTime_t t, _PyTime_round_t round)
391{
Victor Stinner62d1c702015-04-01 17:47:07 +0200392 return _PyTime_Divide(t, NS_TO_US, round);
Victor Stinnerf5faad22015-03-28 03:52:05 +0100393}
394
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200395static int
396_PyTime_AsTimeval_impl(_PyTime_t t, struct timeval *tv, _PyTime_round_t round,
397 int raise)
Victor Stinnercb29f012015-03-27 13:31:18 +0100398{
399 _PyTime_t secs, ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +0100400 int res = 0;
Victor Stinner74474232015-09-02 01:43:56 +0200401 int usec;
Victor Stinnercb29f012015-03-27 13:31:18 +0100402
403 secs = t / SEC_TO_NS;
404 ns = t % SEC_TO_NS;
405
406#ifdef MS_WINDOWS
407 /* On Windows, timeval.tv_sec is a long (32 bit),
408 whereas time_t can be 64-bit. */
409 assert(sizeof(tv->tv_sec) == sizeof(long));
410#if SIZEOF_TIME_T > SIZEOF_LONG
411 if (secs > LONG_MAX) {
Victor Stinner95e9cef2015-03-28 01:26:47 +0100412 secs = LONG_MAX;
413 res = -1;
414 }
415 else if (secs < LONG_MIN) {
416 secs = LONG_MIN;
417 res = -1;
Victor Stinnercb29f012015-03-27 13:31:18 +0100418 }
419#endif
420 tv->tv_sec = (long)secs;
421#else
422 /* On OpenBSD 5.4, timeval.tv_sec is a long.
423 Example: long is 64-bit, whereas time_t is 32-bit. */
424 tv->tv_sec = secs;
Victor Stinner95e9cef2015-03-28 01:26:47 +0100425 if ((_PyTime_t)tv->tv_sec != secs)
426 res = -1;
Victor Stinnercb29f012015-03-27 13:31:18 +0100427#endif
428
Victor Stinner7667f582015-09-09 01:02:23 +0200429 usec = (int)_PyTime_Divide(ns, US_TO_NS, round);
430 if (usec < 0) {
431 usec += SEC_TO_US;
432 tv->tv_sec -= 1;
Victor Stinner74474232015-09-02 01:43:56 +0200433 }
Victor Stinner7667f582015-09-09 01:02:23 +0200434 else if (usec >= SEC_TO_US) {
Victor Stinner74474232015-09-02 01:43:56 +0200435 usec -= SEC_TO_US;
Victor Stinner95e9cef2015-03-28 01:26:47 +0100436 tv->tv_sec += 1;
437 }
438
Victor Stinner67edcc92015-09-02 10:37:46 +0200439 assert(0 <= usec && usec < SEC_TO_US);
440 tv->tv_usec = usec;
441
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200442 if (res && raise)
443 _PyTime_overflow();
Victor Stinner95e9cef2015-03-28 01:26:47 +0100444 return res;
Victor Stinnercb29f012015-03-27 13:31:18 +0100445}
446
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200447int
448_PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
449{
450 return _PyTime_AsTimeval_impl(t, tv, round, 1);
451}
452
453int
454_PyTime_AsTimeval_noraise(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
455{
456 return _PyTime_AsTimeval_impl(t, tv, round, 0);
457}
458
Victor Stinnerc3378382015-03-28 05:07:51 +0100459#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
Victor Stinner34dc0f42015-03-27 18:19:03 +0100460int
461_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)
462{
Victor Stinner95e9cef2015-03-28 01:26:47 +0100463 _PyTime_t secs, nsec;
464
465 secs = t / SEC_TO_NS;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100466 nsec = t % SEC_TO_NS;
467 if (nsec < 0) {
468 nsec += SEC_TO_NS;
Victor Stinner95e9cef2015-03-28 01:26:47 +0100469 secs -= 1;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100470 }
Victor Stinner95e9cef2015-03-28 01:26:47 +0100471 ts->tv_sec = (time_t)secs;
Victor Stinner29ee6742015-09-03 16:25:45 +0200472 assert(0 <= nsec && nsec < SEC_TO_NS);
473 ts->tv_nsec = nsec;
474
Victor Stinner95e9cef2015-03-28 01:26:47 +0100475 if ((_PyTime_t)ts->tv_sec != secs) {
Victor Stinner34dc0f42015-03-27 18:19:03 +0100476 _PyTime_overflow();
477 return -1;
478 }
Victor Stinner34dc0f42015-03-27 18:19:03 +0100479 return 0;
480}
481#endif
482
Victor Stinnercb29f012015-03-27 13:31:18 +0100483static int
Victor Stinnera47b8812015-03-27 18:16:17 +0100484pygettimeofday_new(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
485{
486#ifdef MS_WINDOWS
487 FILETIME system_time;
488 ULARGE_INTEGER large;
489
490 assert(info == NULL || raise);
491
492 GetSystemTimeAsFileTime(&system_time);
493 large.u.LowPart = system_time.dwLowDateTime;
494 large.u.HighPart = system_time.dwHighDateTime;
495 /* 11,644,473,600,000,000,000: number of nanoseconds between
496 the 1st january 1601 and the 1st january 1970 (369 years + 89 leap
497 days). */
498 *tp = large.QuadPart * 100 - 11644473600000000000;
499 if (info) {
500 DWORD timeAdjustment, timeIncrement;
501 BOOL isTimeAdjustmentDisabled, ok;
502
503 info->implementation = "GetSystemTimeAsFileTime()";
504 info->monotonic = 0;
505 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
506 &isTimeAdjustmentDisabled);
507 if (!ok) {
508 PyErr_SetFromWindowsErr(0);
509 return -1;
510 }
511 info->resolution = timeIncrement * 1e-7;
512 info->adjustable = 1;
513 }
514
515#else /* MS_WINDOWS */
516 int err;
517#ifdef HAVE_CLOCK_GETTIME
518 struct timespec ts;
519#else
520 struct timeval tv;
521#endif
522
523 assert(info == NULL || raise);
524
525#ifdef HAVE_CLOCK_GETTIME
526 err = clock_gettime(CLOCK_REALTIME, &ts);
527 if (err) {
528 if (raise)
529 PyErr_SetFromErrno(PyExc_OSError);
530 return -1;
531 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100532 if (_PyTime_FromTimespec(tp, &ts, raise) < 0)
Victor Stinnera47b8812015-03-27 18:16:17 +0100533 return -1;
534
535 if (info) {
536 struct timespec res;
537 info->implementation = "clock_gettime(CLOCK_REALTIME)";
538 info->monotonic = 0;
539 info->adjustable = 1;
540 if (clock_getres(CLOCK_REALTIME, &res) == 0)
541 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
542 else
543 info->resolution = 1e-9;
544 }
545#else /* HAVE_CLOCK_GETTIME */
546
547 /* test gettimeofday() */
548#ifdef GETTIMEOFDAY_NO_TZ
549 err = gettimeofday(&tv);
550#else
551 err = gettimeofday(&tv, (struct timezone *)NULL);
552#endif
553 if (err) {
554 if (raise)
555 PyErr_SetFromErrno(PyExc_OSError);
556 return -1;
557 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100558 if (_PyTime_FromTimeval(tp, &tv, raise) < 0)
Victor Stinnera47b8812015-03-27 18:16:17 +0100559 return -1;
560
561 if (info) {
562 info->implementation = "gettimeofday()";
563 info->resolution = 1e-6;
564 info->monotonic = 0;
565 info->adjustable = 1;
566 }
567#endif /* !HAVE_CLOCK_GETTIME */
568#endif /* !MS_WINDOWS */
569 return 0;
570}
571
Victor Stinner09e5cf22015-03-30 00:09:18 +0200572_PyTime_t
573_PyTime_GetSystemClock(void)
574{
575 _PyTime_t t;
576 if (pygettimeofday_new(&t, NULL, 0) < 0) {
577 /* should not happen, _PyTime_Init() checked the clock at startup */
578 assert(0);
579
580 /* use a fixed value instead of a random value from the stack */
581 t = 0;
582 }
583 return t;
584}
585
Victor Stinnera47b8812015-03-27 18:16:17 +0100586int
587_PyTime_GetSystemClockWithInfo(_PyTime_t *t, _Py_clock_info_t *info)
588{
589 return pygettimeofday_new(t, info, 1);
590}
591
592
593static int
Victor Stinner5ad58212015-09-03 00:14:58 +0200594pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
Victor Stinnercb29f012015-03-27 13:31:18 +0100595{
Victor Stinnercb29f012015-03-27 13:31:18 +0100596#if defined(MS_WINDOWS)
Victor Stinnercb29f012015-03-27 13:31:18 +0100597 ULONGLONG result;
598
599 assert(info == NULL || raise);
600
Victor Stinnereb352292015-03-27 14:12:08 +0100601 result = GetTickCount64();
Victor Stinnercb29f012015-03-27 13:31:18 +0100602
603 *tp = result * MS_TO_NS;
604 if (*tp / MS_TO_NS != result) {
605 if (raise) {
606 _PyTime_overflow();
607 return -1;
608 }
609 /* Hello, time traveler! */
610 assert(0);
611 }
612
613 if (info) {
614 DWORD timeAdjustment, timeIncrement;
615 BOOL isTimeAdjustmentDisabled, ok;
Victor Stinnereb352292015-03-27 14:12:08 +0100616 info->implementation = "GetTickCount64()";
Victor Stinnercb29f012015-03-27 13:31:18 +0100617 info->monotonic = 1;
618 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
619 &isTimeAdjustmentDisabled);
620 if (!ok) {
621 PyErr_SetFromWindowsErr(0);
622 return -1;
623 }
624 info->resolution = timeIncrement * 1e-7;
625 info->adjustable = 0;
626 }
627
628#elif defined(__APPLE__)
629 static mach_timebase_info_data_t timebase;
630 uint64_t time;
631
632 if (timebase.denom == 0) {
633 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
634 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
635 (void)mach_timebase_info(&timebase);
636 }
637
638 time = mach_absolute_time();
639
640 /* apply timebase factor */
641 time *= timebase.numer;
642 time /= timebase.denom;
643
644 *tp = time;
645
646 if (info) {
647 info->implementation = "mach_absolute_time()";
648 info->resolution = (double)timebase.numer / timebase.denom * 1e-9;
649 info->monotonic = 1;
650 info->adjustable = 0;
651 }
652
653#else
654 struct timespec ts;
655#ifdef CLOCK_HIGHRES
656 const clockid_t clk_id = CLOCK_HIGHRES;
657 const char *implementation = "clock_gettime(CLOCK_HIGHRES)";
658#else
659 const clockid_t clk_id = CLOCK_MONOTONIC;
660 const char *implementation = "clock_gettime(CLOCK_MONOTONIC)";
661#endif
662
663 assert(info == NULL || raise);
664
665 if (clock_gettime(clk_id, &ts) != 0) {
666 if (raise) {
667 PyErr_SetFromErrno(PyExc_OSError);
668 return -1;
669 }
670 return -1;
671 }
672
673 if (info) {
674 struct timespec res;
675 info->monotonic = 1;
676 info->implementation = implementation;
677 info->adjustable = 0;
678 if (clock_getres(clk_id, &res) != 0) {
679 PyErr_SetFromErrno(PyExc_OSError);
680 return -1;
681 }
682 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
683 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100684 if (_PyTime_FromTimespec(tp, &ts, raise) < 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100685 return -1;
686#endif
Victor Stinnercb29f012015-03-27 13:31:18 +0100687 return 0;
688}
689
690_PyTime_t
691_PyTime_GetMonotonicClock(void)
692{
693 _PyTime_t t;
Victor Stinner5ad58212015-09-03 00:14:58 +0200694 if (pymonotonic(&t, NULL, 0) < 0) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100695 /* should not happen, _PyTime_Init() checked that monotonic clock at
696 startup */
Victor Stinnercb29f012015-03-27 13:31:18 +0100697 assert(0);
Victor Stinnercb0c6022015-03-28 05:24:19 +0100698
699 /* use a fixed value instead of a random value from the stack */
Victor Stinnercb29f012015-03-27 13:31:18 +0100700 t = 0;
701 }
702 return t;
703}
704
Victor Stinner00111242014-08-29 16:31:59 +0200705int
Victor Stinner4bfb4602015-03-27 22:27:24 +0100706_PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
707{
Victor Stinner5ad58212015-09-03 00:14:58 +0200708 return pymonotonic(tp, info, 1);
Victor Stinner4bfb4602015-03-27 22:27:24 +0100709}
710
711int
Victor Stinner00111242014-08-29 16:31:59 +0200712_PyTime_Init(void)
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +0000713{
Victor Stinnercb29f012015-03-27 13:31:18 +0100714 _PyTime_t t;
715
Victor Stinner00111242014-08-29 16:31:59 +0200716 /* ensure that the system clock works */
Victor Stinnera47b8812015-03-27 18:16:17 +0100717 if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0)
Victor Stinner00111242014-08-29 16:31:59 +0200718 return -1;
Victor Stinnerae586492014-09-02 23:18:25 +0200719
720 /* ensure that the operating system provides a monotonic clock */
Victor Stinnera47b8812015-03-27 18:16:17 +0100721 if (_PyTime_GetMonotonicClockWithInfo(&t, NULL) < 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100722 return -1;
Victor Stinner13019fd2015-04-03 13:10:54 +0200723
724 /* check that _PyTime_FromSeconds() cannot overflow */
725 assert(INT_MAX <= _PyTime_MAX / SEC_TO_NS);
726 assert(INT_MIN >= _PyTime_MIN / SEC_TO_NS);
Victor Stinner00111242014-08-29 16:31:59 +0200727 return 0;
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +0000728}