blob: 3015a6be0b83c1c173b32d85b5ac8bd9961cd278 [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 Stinnerc60542b2015-09-10 15:55:07 +020010#define _PyTime_check_mul_overflow(a, b) \
11 (assert(b > 0), \
12 (_PyTime_t)(a) < _PyTime_MIN / (_PyTime_t)(b) \
13 || _PyTime_MAX / (_PyTime_t)(b) < (_PyTime_t)(a))
14
Victor Stinnercb29f012015-03-27 13:31:18 +010015/* To millisecond (10^-3) */
Victor Stinner580ef132015-03-20 01:55:04 +010016#define SEC_TO_MS 1000
Victor Stinner580ef132015-03-20 01:55:04 +010017
Victor Stinnercb29f012015-03-27 13:31:18 +010018/* To microseconds (10^-6) */
19#define MS_TO_US 1000
Victor Stinner580ef132015-03-20 01:55:04 +010020#define SEC_TO_US (SEC_TO_MS * MS_TO_US)
21
Victor Stinnercb29f012015-03-27 13:31:18 +010022/* To nanoseconds (10^-9) */
23#define US_TO_NS 1000
24#define MS_TO_NS (MS_TO_US * US_TO_NS)
25#define SEC_TO_NS (SEC_TO_MS * MS_TO_NS)
26
Victor Stinner62d1c702015-04-01 17:47:07 +020027/* Conversion from nanoseconds */
28#define NS_TO_MS (1000 * 1000)
29#define NS_TO_US (1000)
30
Victor Stinner5d272cc2012-03-13 13:35:55 +010031static void
32error_time_t_overflow(void)
Victor Stinner643cd682012-03-02 22:54:03 +010033{
Victor Stinner5d272cc2012-03-13 13:35:55 +010034 PyErr_SetString(PyExc_OverflowError,
35 "timestamp out of range for platform time_t");
36}
37
Larry Hastings76ad59b2012-05-03 00:30:07 -070038time_t
Victor Stinner5d272cc2012-03-13 13:35:55 +010039_PyLong_AsTime_t(PyObject *obj)
40{
Benjamin Petersoned4aa832016-09-05 17:44:18 -070041#if SIZEOF_TIME_T == SIZEOF_LONG_LONG
Benjamin Petersonaf580df2016-09-06 10:46:49 -070042 long long val;
Victor Stinner5d272cc2012-03-13 13:35:55 +010043 val = PyLong_AsLongLong(obj);
44#else
45 long val;
Serhiy Storchakafad85aa2015-11-07 15:42:38 +020046 Py_BUILD_ASSERT(sizeof(time_t) <= sizeof(long));
Victor Stinner5d272cc2012-03-13 13:35:55 +010047 val = PyLong_AsLong(obj);
48#endif
49 if (val == -1 && PyErr_Occurred()) {
50 if (PyErr_ExceptionMatches(PyExc_OverflowError))
51 error_time_t_overflow();
52 return -1;
53 }
54 return (time_t)val;
55}
56
Larry Hastings6fe20b32012-04-19 15:07:49 -070057PyObject *
58_PyLong_FromTime_t(time_t t)
59{
Benjamin Petersoned4aa832016-09-05 17:44:18 -070060#if SIZEOF_TIME_T == SIZEOF_LONG_LONG
Benjamin Petersonaf580df2016-09-06 10:46:49 -070061 return PyLong_FromLongLong((long long)t);
Larry Hastings6fe20b32012-04-19 15:07:49 -070062#else
Serhiy Storchakafad85aa2015-11-07 15:42:38 +020063 Py_BUILD_ASSERT(sizeof(time_t) <= sizeof(long));
Larry Hastings6fe20b32012-04-19 15:07:49 -070064 return PyLong_FromLong((long)t);
65#endif
66}
67
Victor Stinnerce6aa742015-09-09 22:28:09 +020068/* Round to nearest with ties going to nearest even integer
69 (_PyTime_ROUND_HALF_EVEN) */
70static double
Victor Stinner7667f582015-09-09 01:02:23 +020071_PyTime_RoundHalfEven(double x)
Victor Stinner74474232015-09-02 01:43:56 +020072{
Victor Stinner7667f582015-09-09 01:02:23 +020073 double rounded = round(x);
74 if (fabs(x-rounded) == 0.5)
75 /* halfway case: round to even */
76 rounded = 2.0*round(x/2.0);
77 return rounded;
Victor Stinner74474232015-09-02 01:43:56 +020078}
79
Victor Stinner9ae47df2015-09-09 22:28:58 +020080static double
81_PyTime_Round(double x, _PyTime_round_t round)
82{
Victor Stinner1efbeba2015-09-10 11:48:00 +020083 /* volatile avoids optimization changing how numbers are rounded */
84 volatile double d;
85
86 d = x;
Victor Stinner9ae47df2015-09-09 22:28:58 +020087 if (round == _PyTime_ROUND_HALF_EVEN)
Victor Stinner1efbeba2015-09-10 11:48:00 +020088 d = _PyTime_RoundHalfEven(d);
Victor Stinner9ae47df2015-09-09 22:28:58 +020089 else if (round == _PyTime_ROUND_CEILING)
Victor Stinner1efbeba2015-09-10 11:48:00 +020090 d = ceil(d);
Victor Stinner9ae47df2015-09-09 22:28:58 +020091 else
Victor Stinner1efbeba2015-09-10 11:48:00 +020092 d = floor(d);
93 return d;
Victor Stinner9ae47df2015-09-09 22:28:58 +020094}
95
Victor Stinner5d272cc2012-03-13 13:35:55 +010096static int
Victor Stinner53e137c2015-09-02 00:49:16 +020097_PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
98 double denominator, _PyTime_round_t round)
99{
100 double intpart, err;
Victor Stinner24b822e2015-09-02 11:58:56 +0200101 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner53e137c2015-09-02 00:49:16 +0200102 volatile double floatpart;
103
104 floatpart = modf(d, &intpart);
Victor Stinner53e137c2015-09-02 00:49:16 +0200105
106 floatpart *= denominator;
Victor Stinner9ae47df2015-09-09 22:28:58 +0200107 floatpart = _PyTime_Round(floatpart, round);
Victor Stinner67edcc92015-09-02 10:37:46 +0200108 if (floatpart >= denominator) {
109 floatpart -= denominator;
110 intpart += 1.0;
Victor Stinner53e137c2015-09-02 00:49:16 +0200111 }
Victor Stinneradfefa52015-09-04 23:57:25 +0200112 else if (floatpart < 0) {
113 floatpart += denominator;
114 intpart -= 1.0;
115 }
Victor Stinner67edcc92015-09-02 10:37:46 +0200116 assert(0.0 <= floatpart && floatpart < denominator);
Victor Stinner53e137c2015-09-02 00:49:16 +0200117
118 *sec = (time_t)intpart;
Victor Stinner67edcc92015-09-02 10:37:46 +0200119 *numerator = (long)floatpart;
120
Victor Stinner53e137c2015-09-02 00:49:16 +0200121 err = intpart - (double)*sec;
122 if (err <= -1.0 || err >= 1.0) {
123 error_time_t_overflow();
124 return -1;
125 }
Victor Stinner53e137c2015-09-02 00:49:16 +0200126 return 0;
127}
128
129static int
Victor Stinner5d272cc2012-03-13 13:35:55 +0100130_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
Victor Stinner3c1b3792014-02-17 00:02:43 +0100131 double denominator, _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100132{
Victor Stinnerbbdda212015-09-02 00:50:43 +0200133 assert(denominator <= (double)LONG_MAX);
134
Victor Stinner643cd682012-03-02 22:54:03 +0100135 if (PyFloat_Check(obj)) {
Victor Stinner53e137c2015-09-02 00:49:16 +0200136 double d = PyFloat_AsDouble(obj);
137 return _PyTime_DoubleToDenominator(d, sec, numerator,
138 denominator, round);
Victor Stinner643cd682012-03-02 22:54:03 +0100139 }
140 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100141 *sec = _PyLong_AsTime_t(obj);
Victor Stinner67edcc92015-09-02 10:37:46 +0200142 *numerator = 0;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100143 if (*sec == (time_t)-1 && PyErr_Occurred())
144 return -1;
Victor Stinner643cd682012-03-02 22:54:03 +0100145 return 0;
146 }
Victor Stinner5d272cc2012-03-13 13:35:55 +0100147}
Victor Stinner643cd682012-03-02 22:54:03 +0100148
Victor Stinner5d272cc2012-03-13 13:35:55 +0100149int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100150_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100151{
152 if (PyFloat_Check(obj)) {
Victor Stinner5786aef2015-09-03 16:33:16 +0200153 double intpart, err;
Victor Stinner24b822e2015-09-02 11:58:56 +0200154 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner5786aef2015-09-03 16:33:16 +0200155 volatile double d;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100156
Victor Stinner5d272cc2012-03-13 13:35:55 +0100157 d = PyFloat_AsDouble(obj);
Victor Stinner9ae47df2015-09-09 22:28:58 +0200158 d = _PyTime_Round(d, round);
Victor Stinner5d272cc2012-03-13 13:35:55 +0100159 (void)modf(d, &intpart);
160
161 *sec = (time_t)intpart;
162 err = intpart - (double)*sec;
163 if (err <= -1.0 || err >= 1.0) {
164 error_time_t_overflow();
165 return -1;
166 }
167 return 0;
168 }
169 else {
170 *sec = _PyLong_AsTime_t(obj);
171 if (*sec == (time_t)-1 && PyErr_Occurred())
172 return -1;
173 return 0;
174 }
175}
176
177int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100178_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec,
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, nsec, 1e9, round);
Victor Stinner67edcc92015-09-02 10:37:46 +0200183 assert(0 <= *nsec && *nsec < SEC_TO_NS);
Victor Stinnerbbdda212015-09-02 00:50:43 +0200184 return res;
Victor Stinner5d272cc2012-03-13 13:35:55 +0100185}
186
187int
Victor Stinner3c1b3792014-02-17 00:02:43 +0100188_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec,
189 _PyTime_round_t round)
Victor Stinner5d272cc2012-03-13 13:35:55 +0100190{
Victor Stinnerbbdda212015-09-02 00:50:43 +0200191 int res;
192 res = _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
Victor Stinner67edcc92015-09-02 10:37:46 +0200193 assert(0 <= *usec && *usec < SEC_TO_US);
Victor Stinnerbbdda212015-09-02 00:50:43 +0200194 return res;
Victor Stinner643cd682012-03-02 22:54:03 +0100195}
196
Victor Stinnercb29f012015-03-27 13:31:18 +0100197static void
198_PyTime_overflow(void)
199{
200 PyErr_SetString(PyExc_OverflowError,
201 "timestamp too large to convert to C _PyTime_t");
202}
203
Victor Stinner4bfb4602015-03-27 22:27:24 +0100204_PyTime_t
Victor Stinner13019fd2015-04-03 13:10:54 +0200205_PyTime_FromSeconds(int seconds)
206{
207 _PyTime_t t;
Victor Stinnerbbdda212015-09-02 00:50:43 +0200208 t = (_PyTime_t)seconds;
Victor Stinner13019fd2015-04-03 13:10:54 +0200209 /* ensure that integer overflow cannot happen, int type should have 32
210 bits, whereas _PyTime_t type has at least 64 bits (SEC_TO_MS takes 30
211 bits). */
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200212 Py_BUILD_ASSERT(INT_MAX <= _PyTime_MAX / SEC_TO_NS);
213 Py_BUILD_ASSERT(INT_MIN >= _PyTime_MIN / SEC_TO_NS);
Victor Stinnerbbdda212015-09-02 00:50:43 +0200214 assert((t >= 0 && t <= _PyTime_MAX / SEC_TO_NS)
215 || (t < 0 && t >= _PyTime_MIN / SEC_TO_NS));
216 t *= SEC_TO_NS;
Victor Stinner13019fd2015-04-03 13:10:54 +0200217 return t;
218}
219
220_PyTime_t
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700221_PyTime_FromNanoseconds(long long ns)
Victor Stinner4bfb4602015-03-27 22:27:24 +0100222{
223 _PyTime_t t;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700224 Py_BUILD_ASSERT(sizeof(long long) <= sizeof(_PyTime_t));
225 t = Py_SAFE_DOWNCAST(ns, long long, _PyTime_t);
Victor Stinner4bfb4602015-03-27 22:27:24 +0100226 return t;
227}
228
Victor Stinnera47b8812015-03-27 18:16:17 +0100229#ifdef HAVE_CLOCK_GETTIME
Victor Stinnercb29f012015-03-27 13:31:18 +0100230static int
Victor Stinnercb0c6022015-03-28 05:24:19 +0100231_PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts, int raise)
Victor Stinnercb29f012015-03-27 13:31:18 +0100232{
233 _PyTime_t t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100234 int res = 0;
235
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200236 Py_BUILD_ASSERT(sizeof(ts->tv_sec) <= sizeof(_PyTime_t));
Victor Stinnerc60542b2015-09-10 15:55:07 +0200237 t = (_PyTime_t)ts->tv_sec;
238
239 if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100240 if (raise)
241 _PyTime_overflow();
242 res = -1;
Victor Stinnercb29f012015-03-27 13:31:18 +0100243 }
Victor Stinnerc60542b2015-09-10 15:55:07 +0200244 t = t * SEC_TO_NS;
Victor Stinnercb29f012015-03-27 13:31:18 +0100245
246 t += ts->tv_nsec;
247
248 *tp = t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100249 return res;
Victor Stinnercb29f012015-03-27 13:31:18 +0100250}
Victor Stinner1bd18ba2015-03-30 00:25:38 +0200251#elif !defined(MS_WINDOWS)
Victor Stinnera47b8812015-03-27 18:16:17 +0100252static int
Victor Stinnercb0c6022015-03-28 05:24:19 +0100253_PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv, int raise)
Victor Stinnera47b8812015-03-27 18:16:17 +0100254{
255 _PyTime_t t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100256 int res = 0;
Victor Stinnera47b8812015-03-27 18:16:17 +0100257
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200258 Py_BUILD_ASSERT(sizeof(tv->tv_sec) <= sizeof(_PyTime_t));
Victor Stinnerc60542b2015-09-10 15:55:07 +0200259 t = (_PyTime_t)tv->tv_sec;
260
261 if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100262 if (raise)
263 _PyTime_overflow();
264 res = -1;
Victor Stinnera47b8812015-03-27 18:16:17 +0100265 }
Victor Stinnerc60542b2015-09-10 15:55:07 +0200266 t = t * SEC_TO_NS;
Victor Stinnera47b8812015-03-27 18:16:17 +0100267
268 t += (_PyTime_t)tv->tv_usec * US_TO_NS;
269
270 *tp = t;
Victor Stinnercb0c6022015-03-28 05:24:19 +0100271 return res;
Victor Stinnera47b8812015-03-27 18:16:17 +0100272}
Victor Stinnercb29f012015-03-27 13:31:18 +0100273#endif
274
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200275static int
Victor Stinner53e137c2015-09-02 00:49:16 +0200276_PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
Victor Stinner9ae47df2015-09-09 22:28:58 +0200277 long unit_to_ns)
Victor Stinner53e137c2015-09-02 00:49:16 +0200278{
Victor Stinner5786aef2015-09-03 16:33:16 +0200279 double err;
Victor Stinner24b822e2015-09-02 11:58:56 +0200280 /* volatile avoids optimization changing how numbers are rounded */
Victor Stinner5786aef2015-09-03 16:33:16 +0200281 volatile double d;
Victor Stinner53e137c2015-09-02 00:49:16 +0200282
283 /* convert to a number of nanoseconds */
284 d = value;
Victor Stinner9ae47df2015-09-09 22:28:58 +0200285 d *= (double)unit_to_ns;
286 d = _PyTime_Round(d, round);
Victor Stinner53e137c2015-09-02 00:49:16 +0200287
288 *t = (_PyTime_t)d;
289 err = d - (double)*t;
290 if (fabs(err) >= 1.0) {
291 _PyTime_overflow();
292 return -1;
293 }
294 return 0;
295}
296
297static int
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200298_PyTime_FromObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round,
Victor Stinner9ae47df2015-09-09 22:28:58 +0200299 long unit_to_ns)
Victor Stinnercb29f012015-03-27 13:31:18 +0100300{
301 if (PyFloat_Check(obj)) {
Victor Stinner53e137c2015-09-02 00:49:16 +0200302 double d;
Victor Stinnercb29f012015-03-27 13:31:18 +0100303 d = PyFloat_AsDouble(obj);
Victor Stinner9ae47df2015-09-09 22:28:58 +0200304 return _PyTime_FromFloatObject(t, d, round, unit_to_ns);
Victor Stinnercb29f012015-03-27 13:31:18 +0100305 }
306 else {
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700307 long long sec;
308 Py_BUILD_ASSERT(sizeof(long long) <= sizeof(_PyTime_t));
Victor Stinner9c72f9b2015-09-10 09:10:14 +0200309
310 sec = PyLong_AsLongLong(obj);
Victor Stinnercb29f012015-03-27 13:31:18 +0100311 if (sec == -1 && PyErr_Occurred()) {
312 if (PyErr_ExceptionMatches(PyExc_OverflowError))
313 _PyTime_overflow();
314 return -1;
315 }
Victor Stinner9c72f9b2015-09-10 09:10:14 +0200316
Victor Stinnerc60542b2015-09-10 15:55:07 +0200317 if (_PyTime_check_mul_overflow(sec, unit_to_ns)) {
Victor Stinnercb29f012015-03-27 13:31:18 +0100318 _PyTime_overflow();
319 return -1;
320 }
Victor Stinnerc60542b2015-09-10 15:55:07 +0200321 *t = sec * unit_to_ns;
Victor Stinnercb29f012015-03-27 13:31:18 +0100322 return 0;
323 }
324}
325
Victor Stinnerfa09beb2015-03-30 21:36:10 +0200326int
327_PyTime_FromSecondsObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round)
328{
329 return _PyTime_FromObject(t, obj, round, SEC_TO_NS);
330}
331
332int
333_PyTime_FromMillisecondsObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round)
334{
335 return _PyTime_FromObject(t, obj, round, MS_TO_NS);
336}
337
Victor Stinner4bfb4602015-03-27 22:27:24 +0100338double
339_PyTime_AsSecondsDouble(_PyTime_t t)
340{
Victor Stinnerff0ed3e2015-09-10 13:25:17 +0200341 /* volatile avoids optimization changing how numbers are rounded */
342 volatile double d;
343
Victor Stinner3e2c8d82015-09-09 22:32:48 +0200344 if (t % SEC_TO_NS == 0) {
345 _PyTime_t secs;
346 /* Divide using integers to avoid rounding issues on the integer part.
347 1e-9 cannot be stored exactly in IEEE 64-bit. */
348 secs = t / SEC_TO_NS;
Victor Stinnerff0ed3e2015-09-10 13:25:17 +0200349 d = (double)secs;
Victor Stinner3e2c8d82015-09-09 22:32:48 +0200350 }
351 else {
Victor Stinnerff0ed3e2015-09-10 13:25:17 +0200352 d = (double)t;
353 d /= 1e9;
Victor Stinner3e2c8d82015-09-09 22:32:48 +0200354 }
Victor Stinnerff0ed3e2015-09-10 13:25:17 +0200355 return d;
Victor Stinner4bfb4602015-03-27 22:27:24 +0100356}
357
Victor Stinner992c43f2015-03-27 17:12:45 +0100358PyObject *
359_PyTime_AsNanosecondsObject(_PyTime_t t)
360{
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700361 Py_BUILD_ASSERT(sizeof(long long) >= sizeof(_PyTime_t));
362 return PyLong_FromLongLong((long long)t);
Victor Stinner992c43f2015-03-27 17:12:45 +0100363}
364
Victor Stinnercb29f012015-03-27 13:31:18 +0100365static _PyTime_t
Victor Stinner7667f582015-09-09 01:02:23 +0200366_PyTime_Divide(const _PyTime_t t, const _PyTime_t k,
367 const _PyTime_round_t round)
Victor Stinnercb29f012015-03-27 13:31:18 +0100368{
Victor Stinner62d1c702015-04-01 17:47:07 +0200369 assert(k > 1);
Victor Stinner7667f582015-09-09 01:02:23 +0200370 if (round == _PyTime_ROUND_HALF_EVEN) {
371 _PyTime_t x, r, abs_r;
Victor Stinner74474232015-09-02 01:43:56 +0200372 x = t / k;
373 r = t % k;
Victor Stinner7667f582015-09-09 01:02:23 +0200374 abs_r = Py_ABS(r);
375 if (abs_r > k / 2 || (abs_r == k / 2 && (Py_ABS(x) & 1))) {
Victor Stinner74474232015-09-02 01:43:56 +0200376 if (t >= 0)
377 x++;
378 else
379 x--;
380 }
381 return x;
382 }
383 else if (round == _PyTime_ROUND_CEILING) {
Victor Stinner62d1c702015-04-01 17:47:07 +0200384 if (t >= 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100385 return (t + k - 1) / k;
386 else
Victor Stinner7667f582015-09-09 01:02:23 +0200387 return t / k;
388 }
389 else {
390 if (t >= 0)
391 return t / k;
392 else
Victor Stinner62d1c702015-04-01 17:47:07 +0200393 return (t - (k - 1)) / k;
Victor Stinnercb29f012015-03-27 13:31:18 +0100394 }
Victor Stinnercb29f012015-03-27 13:31:18 +0100395}
396
397_PyTime_t
398_PyTime_AsMilliseconds(_PyTime_t t, _PyTime_round_t round)
399{
Victor Stinner62d1c702015-04-01 17:47:07 +0200400 return _PyTime_Divide(t, NS_TO_MS, round);
Victor Stinnercb29f012015-03-27 13:31:18 +0100401}
402
Victor Stinnerf5faad22015-03-28 03:52:05 +0100403_PyTime_t
404_PyTime_AsMicroseconds(_PyTime_t t, _PyTime_round_t round)
405{
Victor Stinner62d1c702015-04-01 17:47:07 +0200406 return _PyTime_Divide(t, NS_TO_US, round);
Victor Stinnerf5faad22015-03-28 03:52:05 +0100407}
408
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200409static int
Victor Stinner1e2b6882015-09-18 13:23:02 +0200410_PyTime_AsTimeval_impl(_PyTime_t t, _PyTime_t *p_secs, int *p_us,
411 _PyTime_round_t round)
Victor Stinnercb29f012015-03-27 13:31:18 +0100412{
413 _PyTime_t secs, ns;
Victor Stinner74474232015-09-02 01:43:56 +0200414 int usec;
Victor Stinner1e2b6882015-09-18 13:23:02 +0200415 int res = 0;
Victor Stinnercb29f012015-03-27 13:31:18 +0100416
417 secs = t / SEC_TO_NS;
418 ns = t % SEC_TO_NS;
419
Victor Stinner1e2b6882015-09-18 13:23:02 +0200420 usec = (int)_PyTime_Divide(ns, US_TO_NS, round);
421 if (usec < 0) {
422 usec += SEC_TO_US;
423 if (secs != _PyTime_MIN)
424 secs -= 1;
425 else
426 res = -1;
427 }
428 else if (usec >= SEC_TO_US) {
429 usec -= SEC_TO_US;
430 if (secs != _PyTime_MAX)
431 secs += 1;
432 else
433 res = -1;
434 }
435 assert(0 <= usec && usec < SEC_TO_US);
436
437 *p_secs = secs;
438 *p_us = usec;
439
440 return res;
441}
442
443static int
444_PyTime_AsTimevalStruct_impl(_PyTime_t t, struct timeval *tv,
445 _PyTime_round_t round, int raise)
446{
Victor Stinnerb7a8af22015-10-01 08:44:03 +0200447 _PyTime_t secs, secs2;
Victor Stinner1e2b6882015-09-18 13:23:02 +0200448 int us;
449 int res;
450
451 res = _PyTime_AsTimeval_impl(t, &secs, &us, round);
452
Victor Stinnercb29f012015-03-27 13:31:18 +0100453#ifdef MS_WINDOWS
Victor Stinnercb29f012015-03-27 13:31:18 +0100454 tv->tv_sec = (long)secs;
455#else
Victor Stinnercb29f012015-03-27 13:31:18 +0100456 tv->tv_sec = secs;
Victor Stinner9c72f9b2015-09-10 09:10:14 +0200457#endif
Victor Stinner1e2b6882015-09-18 13:23:02 +0200458 tv->tv_usec = us;
Victor Stinnercb29f012015-03-27 13:31:18 +0100459
Victor Stinnerb7a8af22015-10-01 08:44:03 +0200460 secs2 = (_PyTime_t)tv->tv_sec;
461 if (res < 0 || secs2 != secs) {
Victor Stinner1e2b6882015-09-18 13:23:02 +0200462 if (raise)
463 error_time_t_overflow();
464 return -1;
Victor Stinner74474232015-09-02 01:43:56 +0200465 }
Victor Stinner1e2b6882015-09-18 13:23:02 +0200466 return 0;
Victor Stinnercb29f012015-03-27 13:31:18 +0100467}
468
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200469int
470_PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
471{
Victor Stinner1e2b6882015-09-18 13:23:02 +0200472 return _PyTime_AsTimevalStruct_impl(t, tv, round, 1);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200473}
474
475int
476_PyTime_AsTimeval_noraise(_PyTime_t t, struct timeval *tv, _PyTime_round_t round)
477{
Victor Stinner1e2b6882015-09-18 13:23:02 +0200478 return _PyTime_AsTimevalStruct_impl(t, tv, round, 0);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +0200479}
480
Victor Stinner1e2b6882015-09-18 13:23:02 +0200481int
482_PyTime_AsTimevalTime_t(_PyTime_t t, time_t *p_secs, int *us,
483 _PyTime_round_t round)
484{
485 _PyTime_t secs;
486 int res;
487
488 res = _PyTime_AsTimeval_impl(t, &secs, us, round);
489
490 *p_secs = secs;
491
492 if (res < 0 || (_PyTime_t)*p_secs != secs) {
493 error_time_t_overflow();
494 return -1;
495 }
496 return 0;
497}
498
499
Victor Stinnerc3378382015-03-28 05:07:51 +0100500#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
Victor Stinner34dc0f42015-03-27 18:19:03 +0100501int
502_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts)
503{
Victor Stinner95e9cef2015-03-28 01:26:47 +0100504 _PyTime_t secs, nsec;
505
506 secs = t / SEC_TO_NS;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100507 nsec = t % SEC_TO_NS;
508 if (nsec < 0) {
509 nsec += SEC_TO_NS;
Victor Stinner95e9cef2015-03-28 01:26:47 +0100510 secs -= 1;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100511 }
Victor Stinner95e9cef2015-03-28 01:26:47 +0100512 ts->tv_sec = (time_t)secs;
Victor Stinner29ee6742015-09-03 16:25:45 +0200513 assert(0 <= nsec && nsec < SEC_TO_NS);
514 ts->tv_nsec = nsec;
515
Victor Stinner95e9cef2015-03-28 01:26:47 +0100516 if ((_PyTime_t)ts->tv_sec != secs) {
Victor Stinner9c72f9b2015-09-10 09:10:14 +0200517 error_time_t_overflow();
Victor Stinner34dc0f42015-03-27 18:19:03 +0100518 return -1;
519 }
Victor Stinner34dc0f42015-03-27 18:19:03 +0100520 return 0;
521}
522#endif
523
Victor Stinnercb29f012015-03-27 13:31:18 +0100524static int
Victor Stinnerc379ade2015-11-10 12:11:39 +0100525pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
Victor Stinnera47b8812015-03-27 18:16:17 +0100526{
527#ifdef MS_WINDOWS
528 FILETIME system_time;
529 ULARGE_INTEGER large;
530
531 assert(info == NULL || raise);
532
533 GetSystemTimeAsFileTime(&system_time);
534 large.u.LowPart = system_time.dwLowDateTime;
535 large.u.HighPart = system_time.dwHighDateTime;
536 /* 11,644,473,600,000,000,000: number of nanoseconds between
537 the 1st january 1601 and the 1st january 1970 (369 years + 89 leap
538 days). */
539 *tp = large.QuadPart * 100 - 11644473600000000000;
540 if (info) {
541 DWORD timeAdjustment, timeIncrement;
542 BOOL isTimeAdjustmentDisabled, ok;
543
544 info->implementation = "GetSystemTimeAsFileTime()";
545 info->monotonic = 0;
546 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
547 &isTimeAdjustmentDisabled);
548 if (!ok) {
549 PyErr_SetFromWindowsErr(0);
550 return -1;
551 }
552 info->resolution = timeIncrement * 1e-7;
553 info->adjustable = 1;
554 }
555
556#else /* MS_WINDOWS */
557 int err;
558#ifdef HAVE_CLOCK_GETTIME
559 struct timespec ts;
560#else
561 struct timeval tv;
562#endif
563
564 assert(info == NULL || raise);
565
566#ifdef HAVE_CLOCK_GETTIME
567 err = clock_gettime(CLOCK_REALTIME, &ts);
568 if (err) {
569 if (raise)
570 PyErr_SetFromErrno(PyExc_OSError);
571 return -1;
572 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100573 if (_PyTime_FromTimespec(tp, &ts, raise) < 0)
Victor Stinnera47b8812015-03-27 18:16:17 +0100574 return -1;
575
576 if (info) {
577 struct timespec res;
578 info->implementation = "clock_gettime(CLOCK_REALTIME)";
579 info->monotonic = 0;
580 info->adjustable = 1;
581 if (clock_getres(CLOCK_REALTIME, &res) == 0)
582 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
583 else
584 info->resolution = 1e-9;
585 }
586#else /* HAVE_CLOCK_GETTIME */
587
588 /* test gettimeofday() */
589#ifdef GETTIMEOFDAY_NO_TZ
590 err = gettimeofday(&tv);
591#else
592 err = gettimeofday(&tv, (struct timezone *)NULL);
593#endif
594 if (err) {
595 if (raise)
596 PyErr_SetFromErrno(PyExc_OSError);
597 return -1;
598 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100599 if (_PyTime_FromTimeval(tp, &tv, raise) < 0)
Victor Stinnera47b8812015-03-27 18:16:17 +0100600 return -1;
601
602 if (info) {
603 info->implementation = "gettimeofday()";
604 info->resolution = 1e-6;
605 info->monotonic = 0;
606 info->adjustable = 1;
607 }
608#endif /* !HAVE_CLOCK_GETTIME */
609#endif /* !MS_WINDOWS */
610 return 0;
611}
612
Victor Stinner09e5cf22015-03-30 00:09:18 +0200613_PyTime_t
614_PyTime_GetSystemClock(void)
615{
616 _PyTime_t t;
Victor Stinnerc379ade2015-11-10 12:11:39 +0100617 if (pygettimeofday(&t, NULL, 0) < 0) {
Victor Stinner09e5cf22015-03-30 00:09:18 +0200618 /* should not happen, _PyTime_Init() checked the clock at startup */
619 assert(0);
620
621 /* use a fixed value instead of a random value from the stack */
622 t = 0;
623 }
624 return t;
625}
626
Victor Stinnera47b8812015-03-27 18:16:17 +0100627int
628_PyTime_GetSystemClockWithInfo(_PyTime_t *t, _Py_clock_info_t *info)
629{
Victor Stinnerc379ade2015-11-10 12:11:39 +0100630 return pygettimeofday(t, info, 1);
Victor Stinnera47b8812015-03-27 18:16:17 +0100631}
632
Victor Stinnera47b8812015-03-27 18:16:17 +0100633static int
Victor Stinner5ad58212015-09-03 00:14:58 +0200634pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
Victor Stinnercb29f012015-03-27 13:31:18 +0100635{
Victor Stinnercb29f012015-03-27 13:31:18 +0100636#if defined(MS_WINDOWS)
Victor Stinnerc60542b2015-09-10 15:55:07 +0200637 ULONGLONG ticks;
638 _PyTime_t t;
Victor Stinnercb29f012015-03-27 13:31:18 +0100639
640 assert(info == NULL || raise);
641
Victor Stinnerc60542b2015-09-10 15:55:07 +0200642 ticks = GetTickCount64();
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200643 Py_BUILD_ASSERT(sizeof(ticks) <= sizeof(_PyTime_t));
Victor Stinnerc60542b2015-09-10 15:55:07 +0200644 t = (_PyTime_t)ticks;
Victor Stinnercb29f012015-03-27 13:31:18 +0100645
Victor Stinnerc60542b2015-09-10 15:55:07 +0200646 if (_PyTime_check_mul_overflow(t, MS_TO_NS)) {
Victor Stinnercb29f012015-03-27 13:31:18 +0100647 if (raise) {
648 _PyTime_overflow();
649 return -1;
650 }
651 /* Hello, time traveler! */
652 assert(0);
653 }
Victor Stinnerc60542b2015-09-10 15:55:07 +0200654 *tp = t * MS_TO_NS;
Victor Stinnercb29f012015-03-27 13:31:18 +0100655
656 if (info) {
657 DWORD timeAdjustment, timeIncrement;
658 BOOL isTimeAdjustmentDisabled, ok;
Victor Stinnereb352292015-03-27 14:12:08 +0100659 info->implementation = "GetTickCount64()";
Victor Stinnercb29f012015-03-27 13:31:18 +0100660 info->monotonic = 1;
661 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
662 &isTimeAdjustmentDisabled);
663 if (!ok) {
664 PyErr_SetFromWindowsErr(0);
665 return -1;
666 }
667 info->resolution = timeIncrement * 1e-7;
668 info->adjustable = 0;
669 }
670
671#elif defined(__APPLE__)
672 static mach_timebase_info_data_t timebase;
673 uint64_t time;
674
675 if (timebase.denom == 0) {
676 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
677 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
678 (void)mach_timebase_info(&timebase);
679 }
680
681 time = mach_absolute_time();
682
683 /* apply timebase factor */
684 time *= timebase.numer;
685 time /= timebase.denom;
686
687 *tp = time;
688
689 if (info) {
690 info->implementation = "mach_absolute_time()";
691 info->resolution = (double)timebase.numer / timebase.denom * 1e-9;
692 info->monotonic = 1;
693 info->adjustable = 0;
694 }
695
696#else
697 struct timespec ts;
698#ifdef CLOCK_HIGHRES
699 const clockid_t clk_id = CLOCK_HIGHRES;
700 const char *implementation = "clock_gettime(CLOCK_HIGHRES)";
701#else
702 const clockid_t clk_id = CLOCK_MONOTONIC;
703 const char *implementation = "clock_gettime(CLOCK_MONOTONIC)";
704#endif
705
706 assert(info == NULL || raise);
707
708 if (clock_gettime(clk_id, &ts) != 0) {
709 if (raise) {
710 PyErr_SetFromErrno(PyExc_OSError);
711 return -1;
712 }
713 return -1;
714 }
715
716 if (info) {
717 struct timespec res;
718 info->monotonic = 1;
719 info->implementation = implementation;
720 info->adjustable = 0;
721 if (clock_getres(clk_id, &res) != 0) {
722 PyErr_SetFromErrno(PyExc_OSError);
723 return -1;
724 }
725 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
726 }
Victor Stinnercb0c6022015-03-28 05:24:19 +0100727 if (_PyTime_FromTimespec(tp, &ts, raise) < 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100728 return -1;
729#endif
Victor Stinnercb29f012015-03-27 13:31:18 +0100730 return 0;
731}
732
733_PyTime_t
734_PyTime_GetMonotonicClock(void)
735{
736 _PyTime_t t;
Victor Stinner5ad58212015-09-03 00:14:58 +0200737 if (pymonotonic(&t, NULL, 0) < 0) {
Victor Stinnercb0c6022015-03-28 05:24:19 +0100738 /* should not happen, _PyTime_Init() checked that monotonic clock at
739 startup */
Victor Stinnercb29f012015-03-27 13:31:18 +0100740 assert(0);
Victor Stinnercb0c6022015-03-28 05:24:19 +0100741
742 /* use a fixed value instead of a random value from the stack */
Victor Stinnercb29f012015-03-27 13:31:18 +0100743 t = 0;
744 }
745 return t;
746}
747
Victor Stinner00111242014-08-29 16:31:59 +0200748int
Victor Stinner4bfb4602015-03-27 22:27:24 +0100749_PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
750{
Victor Stinner5ad58212015-09-03 00:14:58 +0200751 return pymonotonic(tp, info, 1);
Victor Stinner4bfb4602015-03-27 22:27:24 +0100752}
753
754int
Victor Stinner00111242014-08-29 16:31:59 +0200755_PyTime_Init(void)
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +0000756{
Victor Stinnercb29f012015-03-27 13:31:18 +0100757 _PyTime_t t;
758
Victor Stinner00111242014-08-29 16:31:59 +0200759 /* ensure that the system clock works */
Victor Stinnera47b8812015-03-27 18:16:17 +0100760 if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0)
Victor Stinner00111242014-08-29 16:31:59 +0200761 return -1;
Victor Stinnerae586492014-09-02 23:18:25 +0200762
763 /* ensure that the operating system provides a monotonic clock */
Victor Stinnera47b8812015-03-27 18:16:17 +0100764 if (_PyTime_GetMonotonicClockWithInfo(&t, NULL) < 0)
Victor Stinnercb29f012015-03-27 13:31:18 +0100765 return -1;
Victor Stinner13019fd2015-04-03 13:10:54 +0200766
Victor Stinner00111242014-08-29 16:31:59 +0200767 return 0;
Alexander Belopolsky6fc4ade2010-08-05 17:34:27 +0000768}
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400769
770int
771_PyTime_localtime(time_t t, struct tm *tm)
772{
773#ifdef MS_WINDOWS
774 int error;
775
776 error = localtime_s(tm, &t);
777 if (error != 0) {
778 errno = error;
779 PyErr_SetFromErrno(PyExc_OSError);
780 return -1;
781 }
782 return 0;
783#else /* !MS_WINDOWS */
784 if (localtime_r(&t, tm) == NULL) {
785#ifdef EINVAL
786 if (errno == 0)
787 errno = EINVAL;
788#endif
789 PyErr_SetFromErrno(PyExc_OSError);
790 return -1;
791 }
792 return 0;
793#endif /* MS_WINDOWS */
794}
795
796int
797_PyTime_gmtime(time_t t, struct tm *tm)
798{
799#ifdef MS_WINDOWS
800 int error;
801
802 error = gmtime_s(tm, &t);
803 if (error != 0) {
804 errno = error;
805 PyErr_SetFromErrno(PyExc_OSError);
806 return -1;
807 }
808 return 0;
809#else /* !MS_WINDOWS */
810 if (gmtime_r(&t, tm) == NULL) {
811#ifdef EINVAL
812 if (errno == 0)
813 errno = EINVAL;
814#endif
815 PyErr_SetFromErrno(PyExc_OSError);
816 return -1;
817 }
818 return 0;
819#endif /* MS_WINDOWS */
820}