blob: c3ecd80a6083f1338b06d361a687ba0fdd651da6 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Time module */
2
Barry Warsaw9a2a8a81996-12-06 23:32:14 +00003#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00004
Guido van Rossum87ce7bb1998-06-09 16:30:31 +00005#include <ctype.h>
6
Victor Stinnerec895392012-04-29 02:41:27 +02007#ifdef HAVE_SYS_TIMES_H
8#include <sys/times.h>
9#endif
10
Thomas Wouters0e3f5912006-08-11 14:57:12 +000011#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#include <sys/types.h>
Victor Stinnerec895392012-04-29 02:41:27 +020013#endif
14
15#if defined(HAVE_SYS_RESOURCE_H)
16#include <sys/resource.h>
17#endif
Guido van Rossum6d946f91992-08-14 13:49:30 +000018
Guido van Rossumb6775db1994-08-01 11:34:53 +000019#ifdef QUICKWIN
20#include <io.h>
21#endif
22
pdoxe14679c2017-10-05 00:01:56 -070023#if defined(HAVE_PTHREAD_H)
24# include <pthread.h>
25#endif
26
Guido van Rossum7bf22de1997-12-02 20:34:19 +000027#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000028#include <i86.h>
29#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000030#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000031#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000032#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000033#include "pythread.h"
Guido van Rossumcac6c721996-09-06 13:34:02 +000034#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000035#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000036
Victor Stinnerc29b5852017-11-02 07:28:27 -070037#define SEC_TO_NS (1000 * 1000 * 1000)
38
Guido van Rossum234f9421993-06-17 12:35:49 +000039/* Forward declarations */
Victor Stinnercb29f012015-03-27 13:31:18 +010040static int pysleep(_PyTime_t);
Victor Stinnerec895392012-04-29 02:41:27 +020041
Victor Stinner85fdfa82012-01-27 00:38:48 +010042
Victor Stinnera997c7b2017-10-10 02:51:50 -070043static PyObject*
44_PyFloat_FromPyTime(_PyTime_t t)
45{
46 double d = _PyTime_AsSecondsDouble(t);
47 return PyFloat_FromDouble(d);
48}
49
Victor Stinnerc29b5852017-11-02 07:28:27 -070050
Victor Stinner4195b5c2012-02-08 23:03:19 +010051static PyObject *
Victor Stinnerc29b5852017-11-02 07:28:27 -070052time_time(PyObject *self, PyObject *unused)
Victor Stinner85fdfa82012-01-27 00:38:48 +010053{
Victor Stinnerc29b5852017-11-02 07:28:27 -070054 _PyTime_t t = _PyTime_GetSystemClock();
55 return _PyFloat_FromPyTime(t);
56}
57
58
59PyDoc_STRVAR(time_doc,
60"time() -> floating point number\n\
61\n\
62Return the current time in seconds since the Epoch.\n\
63Fractions of a second may be present if the system clock provides them.");
64
65static PyObject *
66time_time_ns(PyObject *self, PyObject *unused)
67{
68 _PyTime_t t = _PyTime_GetSystemClock();
69 return _PyTime_AsNanosecondsObject(t);
70}
71
72PyDoc_STRVAR(time_ns_doc,
73"time_ns() -> int\n\
74\n\
75Return the current time in nanoseconds since the Epoch.");
76
77#if defined(HAVE_CLOCK)
78
79#ifndef CLOCKS_PER_SEC
80# ifdef CLK_TCK
81# define CLOCKS_PER_SEC CLK_TCK
82# else
83# define CLOCKS_PER_SEC 1000000
84# endif
85#endif
86
87static int
88_PyTime_GetClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
89{
90 static int initialized = 0;
91 clock_t ticks;
92
93 if (!initialized) {
94 initialized = 1;
95
96 /* must sure that _PyTime_MulDiv(ticks, SEC_TO_NS, CLOCKS_PER_SEC)
97 above cannot overflow */
98 if ((_PyTime_t)CLOCKS_PER_SEC > _PyTime_MAX / SEC_TO_NS) {
99 PyErr_SetString(PyExc_OverflowError,
100 "CLOCKS_PER_SEC is too large");
101 return -1;
102 }
Victor Stinner85fdfa82012-01-27 00:38:48 +0100103 }
Victor Stinnerc29b5852017-11-02 07:28:27 -0700104
Victor Stinnerec895392012-04-29 02:41:27 +0200105 if (info) {
106 info->implementation = "clock()";
107 info->resolution = 1.0 / (double)CLOCKS_PER_SEC;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400108 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200109 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200110 }
Victor Stinnerc29b5852017-11-02 07:28:27 -0700111
112 ticks = clock();
113 if (ticks == (clock_t)-1) {
114 PyErr_SetString(PyExc_RuntimeError,
115 "the processor time used is not available "
116 "or its value cannot be represented");
117 return -1;
118 }
119 *tp = _PyTime_MulDiv(ticks, SEC_TO_NS, (_PyTime_t)CLOCKS_PER_SEC);
120 return 0;
Victor Stinner85fdfa82012-01-27 00:38:48 +0100121}
122#endif /* HAVE_CLOCK */
123
Victor Stinnercba9a0c2017-10-12 08:51:56 -0700124static PyObject*
125perf_counter(_Py_clock_info_t *info)
126{
Victor Stinnerbdaeb7d2017-10-16 08:44:31 -0700127 _PyTime_t t;
128 if (_PyTime_GetPerfCounterWithInfo(&t, info) < 0) {
Victor Stinnercba9a0c2017-10-12 08:51:56 -0700129 return NULL;
130 }
Victor Stinnerc29b5852017-11-02 07:28:27 -0700131 return _PyFloat_FromPyTime(t);
Victor Stinnercba9a0c2017-10-12 08:51:56 -0700132}
133
Victor Stinnera997c7b2017-10-10 02:51:50 -0700134#if defined(MS_WINDOWS) || defined(HAVE_CLOCK)
Victor Stinnerec895392012-04-29 02:41:27 +0200135#define PYCLOCK
136static PyObject*
137pyclock(_Py_clock_info_t *info)
138{
Victor Stinner884d13a2017-10-17 14:46:45 -0700139 if (PyErr_WarnEx(PyExc_DeprecationWarning,
140 "time.clock has been deprecated in Python 3.3 and will "
141 "be removed from Python 3.8: "
142 "use time.perf_counter or time.process_time "
143 "instead", 1) < 0) {
144 return NULL;
145 }
Victor Stinnerc29b5852017-11-02 07:28:27 -0700146
Victor Stinnera997c7b2017-10-10 02:51:50 -0700147#ifdef MS_WINDOWS
Victor Stinnercba9a0c2017-10-12 08:51:56 -0700148 return perf_counter(info);
Victor Stinner54884492014-08-29 16:51:33 +0200149#else
Victor Stinnerc29b5852017-11-02 07:28:27 -0700150 _PyTime_t t;
151 if (_PyTime_GetClockWithInfo(&t, info) < 0) {
152 return NULL;
153 }
154 return _PyFloat_FromPyTime(t);
Victor Stinner54884492014-08-29 16:51:33 +0200155#endif
Victor Stinnerec895392012-04-29 02:41:27 +0200156}
157
Victor Stinner9122fdd2011-07-04 13:55:40 +0200158static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100159time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200160{
Victor Stinnerec895392012-04-29 02:41:27 +0200161 return pyclock(NULL);
Victor Stinner9122fdd2011-07-04 13:55:40 +0200162}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000164PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100165"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000166\n\
167Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000168the first call to clock(). This has as much precision as the system\n\
169records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000170#endif
171
Victor Stinnere0be4232011-10-25 13:06:09 +0200172#ifdef HAVE_CLOCK_GETTIME
173static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100174time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200175{
176 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200177 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200178 struct timespec tp;
179
Victor Stinnerc29b5852017-11-02 07:28:27 -0700180 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200181 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -0700182 }
Victor Stinnere0be4232011-10-25 13:06:09 +0200183
184 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100185 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200186 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100187 return NULL;
188 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100189 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200190}
191
192PyDoc_STRVAR(clock_gettime_doc,
Victor Stinnerc29b5852017-11-02 07:28:27 -0700193"clock_gettime(clk_id) -> float\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200194\n\
195Return the time of the specified clock clk_id.");
Victor Stinnerc29b5852017-11-02 07:28:27 -0700196
197static PyObject *
198time_clock_gettime_ns(PyObject *self, PyObject *args)
199{
200 int ret;
201 int clk_id;
202 struct timespec ts;
203 _PyTime_t t;
204
205 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) {
206 return NULL;
207 }
208
209 ret = clock_gettime((clockid_t)clk_id, &ts);
210 if (ret != 0) {
211 PyErr_SetFromErrno(PyExc_OSError);
212 return NULL;
213 }
214 if (_PyTime_FromTimespec(&t, &ts) < 0) {
215 return NULL;
216 }
217 return _PyTime_AsNanosecondsObject(t);
218}
219
220PyDoc_STRVAR(clock_gettime_ns_doc,
221"clock_gettime_ns(clk_id) -> int\n\
222\n\
223Return the time of the specified clock clk_id as nanoseconds.");
Benjamin Peterson37098cd2016-09-13 22:55:09 -0700224#endif /* HAVE_CLOCK_GETTIME */
Victor Stinner30d79472012-04-03 00:45:07 +0200225
Benjamin Peterson37098cd2016-09-13 22:55:09 -0700226#ifdef HAVE_CLOCK_SETTIME
Victor Stinner30d79472012-04-03 00:45:07 +0200227static PyObject *
228time_clock_settime(PyObject *self, PyObject *args)
229{
Victor Stinnerb8d01692012-04-13 23:44:05 +0200230 int clk_id;
Victor Stinner30d79472012-04-03 00:45:07 +0200231 PyObject *obj;
Victor Stinnerb3b45442015-03-28 04:09:41 +0100232 _PyTime_t t;
Victor Stinner30d79472012-04-03 00:45:07 +0200233 struct timespec tp;
234 int ret;
235
236 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
237 return NULL;
238
Victor Stinner02937aa2015-03-28 05:02:39 +0100239 if (_PyTime_FromSecondsObject(&t, obj, _PyTime_ROUND_FLOOR) < 0)
Victor Stinner30d79472012-04-03 00:45:07 +0200240 return NULL;
Victor Stinnerb3b45442015-03-28 04:09:41 +0100241
242 if (_PyTime_AsTimespec(t, &tp) == -1)
243 return NULL;
Victor Stinner30d79472012-04-03 00:45:07 +0200244
245 ret = clock_settime((clockid_t)clk_id, &tp);
246 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200247 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinner30d79472012-04-03 00:45:07 +0200248 return NULL;
249 }
250 Py_RETURN_NONE;
251}
252
253PyDoc_STRVAR(clock_settime_doc,
254"clock_settime(clk_id, time)\n\
255\n\
256Set the time of the specified clock clk_id.");
Victor Stinnerc29b5852017-11-02 07:28:27 -0700257
258static PyObject *
259time_clock_settime_ns(PyObject *self, PyObject *args)
260{
261 int clk_id;
262 PyObject *obj;
263 _PyTime_t t;
264 struct timespec ts;
265 int ret;
266
267 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj)) {
268 return NULL;
269 }
270
271 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
272 return NULL;
273 }
274 if (_PyTime_AsTimespec(t, &ts) == -1) {
275 return NULL;
276 }
277
278 ret = clock_settime((clockid_t)clk_id, &ts);
279 if (ret != 0) {
280 PyErr_SetFromErrno(PyExc_OSError);
281 return NULL;
282 }
283 Py_RETURN_NONE;
284}
285
286PyDoc_STRVAR(clock_settime_ns_doc,
287"clock_settime_ns(clk_id, time)\n\
288\n\
289Set the time of the specified clock clk_id with nanoseconds.");
Benjamin Peterson37098cd2016-09-13 22:55:09 -0700290#endif /* HAVE_CLOCK_SETTIME */
Victor Stinnere0be4232011-10-25 13:06:09 +0200291
Benjamin Peterson37098cd2016-09-13 22:55:09 -0700292#ifdef HAVE_CLOCK_GETRES
Victor Stinnere0be4232011-10-25 13:06:09 +0200293static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100294time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200295{
296 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200297 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200298 struct timespec tp;
299
Victor Stinner4195b5c2012-02-08 23:03:19 +0100300 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200301 return NULL;
302
303 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100304 if (ret != 0) {
Victor Stinnera734af32014-07-31 13:07:17 +0200305 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100306 return NULL;
307 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100308
309 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200310}
311
312PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100313"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200314\n\
315Return the resolution (precision) of the specified clock clk_id.");
Benjamin Peterson37098cd2016-09-13 22:55:09 -0700316#endif /* HAVE_CLOCK_GETRES */
Victor Stinnere0be4232011-10-25 13:06:09 +0200317
pdoxe14679c2017-10-05 00:01:56 -0700318#ifdef HAVE_PTHREAD_GETCPUCLOCKID
319static PyObject *
320time_pthread_getcpuclockid(PyObject *self, PyObject *args)
321{
322 unsigned long thread_id;
323 int err;
324 clockid_t clk_id;
325 if (!PyArg_ParseTuple(args, "k:pthread_getcpuclockid", &thread_id)) {
326 return NULL;
327 }
328 err = pthread_getcpuclockid((pthread_t)thread_id, &clk_id);
329 if (err) {
330 errno = err;
331 PyErr_SetFromErrno(PyExc_OSError);
332 return NULL;
333 }
334 return PyLong_FromLong(clk_id);
335}
336
337PyDoc_STRVAR(pthread_getcpuclockid_doc,
338"pthread_getcpuclockid(thread_id) -> int\n\
339\n\
340Return the clk_id of a thread's CPU time clock.");
341#endif /* HAVE_PTHREAD_GETCPUCLOCKID */
342
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000343static PyObject *
Victor Stinnercb29f012015-03-27 13:31:18 +0100344time_sleep(PyObject *self, PyObject *obj)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345{
Victor Stinnercb29f012015-03-27 13:31:18 +0100346 _PyTime_t secs;
Pablo Galindo59af94f2017-10-18 08:13:09 +0100347 if (_PyTime_FromSecondsObject(&secs, obj, _PyTime_ROUND_TIMEOUT))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200349 if (secs < 0) {
350 PyErr_SetString(PyExc_ValueError,
351 "sleep length must be non-negative");
352 return NULL;
353 }
Victor Stinnercb29f012015-03-27 13:31:18 +0100354 if (pysleep(secs) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200356 Py_RETURN_NONE;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357}
358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000359PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000360"sleep(seconds)\n\
361\n\
362Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000363a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000364
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000365static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000366 {"tm_year", "year, for example, 1993"},
367 {"tm_mon", "month of year, range [1, 12]"},
368 {"tm_mday", "day of month, range [1, 31]"},
369 {"tm_hour", "hours, range [0, 23]"},
370 {"tm_min", "minutes, range [0, 59]"},
371 {"tm_sec", "seconds, range [0, 61])"},
372 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
373 {"tm_yday", "day of year, range [1, 366]"},
374 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400375 {"tm_zone", "abbreviation of timezone name"},
376 {"tm_gmtoff", "offset from UTC in seconds"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000378};
379
380static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000382 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
383 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
384 " sequence of 9 integers.\n\n"
385 " Note that several fields' values are not the same as those defined by\n"
386 " the C language standard for struct tm. For example, the value of the\n"
387 " field tm_year is the actual year, not year - 1900. See individual\n"
388 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 struct_time_type_fields,
390 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000391};
Tim Peters9ad4b682002-02-13 05:14:18 +0000392
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000393static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000394static PyTypeObject StructTimeType;
395
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400396
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000397static PyObject *
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400398tmtotuple(struct tm *p
399#ifndef HAVE_STRUCT_TM_TM_ZONE
Victor Stinner0d659e52017-04-25 01:22:42 +0200400 , const char *zone, time_t gmtoff
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400401#endif
402)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 PyObject *v = PyStructSequence_New(&StructTimeType);
405 if (v == NULL)
406 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000407
Christian Heimes217cfd12007-12-02 14:31:20 +0000408#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 SET(0, p->tm_year + 1900);
411 SET(1, p->tm_mon + 1); /* Want January == 1 */
412 SET(2, p->tm_mday);
413 SET(3, p->tm_hour);
414 SET(4, p->tm_min);
415 SET(5, p->tm_sec);
416 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
417 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
418 SET(8, p->tm_isdst);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400419#ifdef HAVE_STRUCT_TM_TM_ZONE
420 PyStructSequence_SET_ITEM(v, 9,
Victor Stinner7ed7aea2018-01-15 10:45:49 +0100421 PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400422 SET(10, p->tm_gmtoff);
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400423#else
424 PyStructSequence_SET_ITEM(v, 9,
Victor Stinner7ed7aea2018-01-15 10:45:49 +0100425 PyUnicode_DecodeLocale(zone, "surrogateescape"));
Victor Stinner0d659e52017-04-25 01:22:42 +0200426 PyStructSequence_SET_ITEM(v, 10, _PyLong_FromTime_t(gmtoff));
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400427#endif /* HAVE_STRUCT_TM_TM_ZONE */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000428#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 if (PyErr_Occurred()) {
430 Py_XDECREF(v);
431 return NULL;
432 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000435}
436
Fred Drakef901abd2004-08-03 17:58:55 +0000437/* Parse arg tuple that can contain an optional float-or-None value;
438 format needs to be "|O:name".
439 Returns non-zero on success (parallels PyArg_ParseTuple).
440*/
441static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200442parse_time_t_args(PyObject *args, const char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100445 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 if (!PyArg_ParseTuple(args, format, &ot))
448 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100449 if (ot == NULL || ot == Py_None) {
450 whent = time(NULL);
451 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 else {
Victor Stinner02937aa2015-03-28 05:02:39 +0100453 if (_PyTime_ObjectToTime_t(ot, &whent, _PyTime_ROUND_FLOOR) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100454 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100456 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000458}
459
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000460static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000461time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000462{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100463 time_t when;
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400464 struct tm buf;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100465
466 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100468
469 errno = 0;
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400470 if (_PyTime_gmtime(when, &buf) != 0)
471 return NULL;
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400472#ifdef HAVE_STRUCT_TM_TM_ZONE
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100473 return tmtotuple(&buf);
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400474#else
475 return tmtotuple(&buf, "UTC", 0);
476#endif
Guido van Rossum234f9421993-06-17 12:35:49 +0000477}
478
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400479#ifndef HAVE_TIMEGM
480static time_t
481timegm(struct tm *p)
482{
483 /* XXX: the following implementation will not work for tm_year < 1970.
484 but it is likely that platforms that don't have timegm do not support
485 negative timestamps anyways. */
486 return p->tm_sec + p->tm_min*60 + p->tm_hour*3600 + p->tm_yday*86400 +
487 (p->tm_year-70)*31536000 + ((p->tm_year-69)/4)*86400 -
488 ((p->tm_year-1)/100)*86400 + ((p->tm_year+299)/400)*86400;
489}
490#endif
491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000492PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000493"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000494 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000495\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000496Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400497GMT). When 'seconds' is not passed in, convert the current time instead.\n\
498\n\
499If the platform supports the tm_gmtoff and tm_zone, they are available as\n\
500attributes only.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000501
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000502static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000503time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000504{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100505 time_t when;
506 struct tm buf;
507
508 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 return NULL;
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400510 if (_PyTime_localtime(when, &buf) != 0)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100511 return NULL;
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400512#ifdef HAVE_STRUCT_TM_TM_ZONE
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100513 return tmtotuple(&buf);
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400514#else
515 {
516 struct tm local = buf;
517 char zone[100];
Victor Stinner0d659e52017-04-25 01:22:42 +0200518 time_t gmtoff;
Steve Dowerc3c6f712016-12-14 11:22:05 -0800519 strftime(zone, sizeof(zone), "%Z", &buf);
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -0400520 gmtoff = timegm(&buf) - when;
521 return tmtotuple(&local, zone, gmtoff);
522 }
523#endif
Guido van Rossum234f9421993-06-17 12:35:49 +0000524}
525
Benjamin Peterson5633c4f2018-09-14 09:09:04 -0700526#if defined(__linux__) && !defined(__GLIBC__)
527static const char *utc_string = NULL;
528#endif
529
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000530PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000531"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000533\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000534Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000535When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000536
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000537/* Convert 9-item tuple to tm structure. Return 1 on success, set
538 * an exception and return 0 on error.
539 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000540static int
Oren Milman1d1d3e92017-08-20 18:35:36 +0300541gettmarg(PyObject *args, struct tm *p, const char *format)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000546
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000547 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 PyErr_SetString(PyExc_TypeError,
549 "Tuple or struct_time argument required");
550 return 0;
551 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000552
Oren Milman1d1d3e92017-08-20 18:35:36 +0300553 if (!PyArg_ParseTuple(args, format,
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000554 &y, &p->tm_mon, &p->tm_mday,
555 &p->tm_hour, &p->tm_min, &p->tm_sec,
556 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return 0;
Gregory P. Smith76be0ff2018-08-24 18:08:50 -0700558
559 if (y < INT_MIN + 1900) {
560 PyErr_SetString(PyExc_OverflowError, "year out of range");
561 return 0;
562 }
563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 p->tm_year = y - 1900;
565 p->tm_mon--;
566 p->tm_wday = (p->tm_wday + 1) % 7;
567 p->tm_yday--;
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400568#ifdef HAVE_STRUCT_TM_TM_ZONE
569 if (Py_TYPE(args) == &StructTimeType) {
570 PyObject *item;
571 item = PyTuple_GET_ITEM(args, 9);
Benjamin Peterson5633c4f2018-09-14 09:09:04 -0700572 if (item != Py_None) {
Xiang Zhang163eca32018-10-28 23:58:42 +0800573 p->tm_zone = (char *)PyUnicode_AsUTF8(item);
Benjamin Peterson5633c4f2018-09-14 09:09:04 -0700574 if (p->tm_zone == NULL) {
575 return 0;
576 }
577#if defined(__linux__) && !defined(__GLIBC__)
578 // Make an attempt to return the C library's own timezone strings to
579 // it. musl refuses to process a tm_zone field unless it produced
580 // it. See issue #34672.
581 if (utc_string && strcmp(p->tm_zone, utc_string) == 0) {
582 p->tm_zone = utc_string;
583 }
584 else if (tzname[0] && strcmp(p->tm_zone, tzname[0]) == 0) {
585 p->tm_zone = tzname[0];
586 }
587 else if (tzname[1] && strcmp(p->tm_zone, tzname[1]) == 0) {
588 p->tm_zone = tzname[1];
589 }
590#endif
591 }
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400592 item = PyTuple_GET_ITEM(args, 10);
Benjamin Peterson5633c4f2018-09-14 09:09:04 -0700593 if (item != Py_None) {
594 p->tm_gmtoff = PyLong_AsLong(item);
595 if (PyErr_Occurred())
596 return 0;
597 }
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400598 }
599#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000601}
602
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000603/* Check values of the struct tm fields before it is passed to strftime() and
604 * asctime(). Return 1 if all values are valid, otherwise set an exception
605 * and returns 0.
606 */
Victor Stinneref128102010-10-07 01:00:52 +0000607static int
608checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000609{
Victor Stinneref128102010-10-07 01:00:52 +0000610 /* Checks added to make sure strftime() and asctime() does not crash Python by
611 indexing blindly into some array for a textual representation
612 by some bad index (fixes bug #897625 and #6608).
613
614 Also support values of zero from Python code for arguments in which
615 that is out of range by forcing that value to the lowest value that
616 is valid (fixed bug #1520914).
617
618 Valid ranges based on what is allowed in struct tm:
619
620 - tm_year: [0, max(int)] (1)
621 - tm_mon: [0, 11] (2)
622 - tm_mday: [1, 31]
623 - tm_hour: [0, 23]
624 - tm_min: [0, 59]
625 - tm_sec: [0, 60]
626 - tm_wday: [0, 6] (1)
627 - tm_yday: [0, 365] (2)
628 - tm_isdst: [-max(int), max(int)]
629
630 (1) gettmarg() handles bounds-checking.
631 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000632 thus need to check against automatic decrement by gettmarg().
633 */
634 if (buf->tm_mon == -1)
635 buf->tm_mon = 0;
636 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
637 PyErr_SetString(PyExc_ValueError, "month out of range");
638 return 0;
639 }
640 if (buf->tm_mday == 0)
641 buf->tm_mday = 1;
642 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
643 PyErr_SetString(PyExc_ValueError, "day of month out of range");
644 return 0;
645 }
646 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
647 PyErr_SetString(PyExc_ValueError, "hour out of range");
648 return 0;
649 }
650 if (buf->tm_min < 0 || buf->tm_min > 59) {
651 PyErr_SetString(PyExc_ValueError, "minute out of range");
652 return 0;
653 }
654 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
655 PyErr_SetString(PyExc_ValueError, "seconds out of range");
656 return 0;
657 }
658 /* tm_wday does not need checking of its upper-bound since taking
659 ``% 7`` in gettmarg() automatically restricts the range. */
660 if (buf->tm_wday < 0) {
661 PyErr_SetString(PyExc_ValueError, "day of week out of range");
662 return 0;
663 }
664 if (buf->tm_yday == -1)
665 buf->tm_yday = 0;
666 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
667 PyErr_SetString(PyExc_ValueError, "day of year out of range");
668 return 0;
669 }
670 return 1;
671}
672
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200673#ifdef MS_WINDOWS
674 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
675# undef HAVE_WCSFTIME
676#endif
Alexander Belopolskycf774542012-10-02 18:39:16 -0400677#define STRFTIME_FORMAT_CODES \
678"Commonly used format codes:\n\
679\n\
680%Y Year with century as a decimal number.\n\
681%m Month as a decimal number [01,12].\n\
682%d Day of the month as a decimal number [01,31].\n\
683%H Hour (24-hour clock) as a decimal number [00,23].\n\
684%M Minute as a decimal number [00,59].\n\
685%S Second as a decimal number [00,61].\n\
686%z Time zone offset from UTC.\n\
687%a Locale's abbreviated weekday name.\n\
688%A Locale's full weekday name.\n\
689%b Locale's abbreviated month name.\n\
690%B Locale's full month name.\n\
691%c Locale's appropriate date and time representation.\n\
692%I Hour (12-hour clock) as a decimal number [01,12].\n\
693%p Locale's equivalent of either AM or PM.\n\
694\n\
695Other codes may be available on your platform. See documentation for\n\
696the C library strftime function.\n"
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200697
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000698#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000699#ifdef HAVE_WCSFTIME
700#define time_char wchar_t
701#define format_time wcsftime
702#define time_strlen wcslen
703#else
704#define time_char char
705#define format_time strftime
706#define time_strlen strlen
707#endif
708
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000709static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000710time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 PyObject *tup = NULL;
713 struct tm buf;
714 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000715#ifdef HAVE_WCSFTIME
716 wchar_t *format;
717#else
718 PyObject *format;
719#endif
Victor Stinneref128102010-10-07 01:00:52 +0000720 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000722 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000724 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 /* Will always expect a unicode string to be passed as format.
729 Given that there's no str type anymore in py3k this seems safe.
730 */
Victor Stinneref128102010-10-07 01:00:52 +0000731 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (tup == NULL) {
735 time_t tt = time(NULL);
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400736 if (_PyTime_localtime(tt, &buf) != 0)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100737 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000738 }
Oren Milman1d1d3e92017-08-20 18:35:36 +0300739 else if (!gettmarg(tup, &buf,
740 "iiiiiiiii;strftime(): illegal time tuple argument") ||
741 !checktm(&buf))
742 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +0300744 }
Guido van Rossum10b164a2001-09-25 13:59:01 +0000745
Victor Stinner36b82d82013-06-25 02:33:53 +0200746#if defined(_MSC_VER) || defined(sun) || defined(_AIX)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000747 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100748 PyErr_SetString(PyExc_ValueError,
749 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000750 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000751 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000752#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 /* Normalize tm_isdst just in case someone foolishly implements %Z
755 based on the assumption that tm_isdst falls within the range of
756 [-1, 1] */
757 if (buf.tm_isdst < -1)
758 buf.tm_isdst = -1;
759 else if (buf.tm_isdst > 1)
760 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000761
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000762#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000763 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000764 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000766 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100769 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 if (format == NULL)
771 return NULL;
772 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000773#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000774
Stefan Krah4aea7d32012-02-27 16:30:26 +0100775#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 /* check that the format string contains only valid directives */
Steve Dowere5b58952015-09-06 19:20:51 -0700777 for (outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200779 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 {
Steve Dowere5b58952015-09-06 19:20:51 -0700781 if (outbuf[1] == '#')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 ++outbuf; /* not documented by python, */
Steve Dowere5b58952015-09-06 19:20:51 -0700783 if (outbuf[1] == '\0')
784 break;
785 if ((outbuf[1] == 'y') && buf.tm_year < 0) {
Tim Golden6e51b8f2013-11-12 12:36:54 +0000786 PyErr_SetString(PyExc_ValueError,
787 "format %y requires year >= 1900 on Windows");
788 Py_DECREF(format);
789 return NULL;
790 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 }
Victor Stinner93965f72013-11-23 14:59:33 +0100792#elif (defined(_AIX) || defined(sun)) && defined(HAVE_WCSFTIME)
Steve Dowere5b58952015-09-06 19:20:51 -0700793 for (outbuf = wcschr(fmt, '%');
Victor Stinner55329f82013-11-17 23:39:21 +0100794 outbuf != NULL;
795 outbuf = wcschr(outbuf+2, '%'))
796 {
Steve Dowere5b58952015-09-06 19:20:51 -0700797 if (outbuf[1] == L'\0')
798 break;
Victor Stinner55329f82013-11-17 23:39:21 +0100799 /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0))
800 returns "0/" instead of "99" */
801 if (outbuf[1] == L'y' && buf.tm_year < 0) {
802 PyErr_SetString(PyExc_ValueError,
803 "format %y requires year >= 1900 on AIX");
Zackery Spytz91e6c872018-09-21 00:09:48 -0600804 PyMem_Free(format);
Victor Stinner55329f82013-11-17 23:39:21 +0100805 return NULL;
806 }
807 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000808#endif
809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 /* I hate these functions that presume you know how big the output
813 * will be ahead of time...
814 */
815 for (i = 1024; ; i += i) {
816 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
817 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000818 PyErr_NoMemory();
819 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 }
Steve Dower57ab1cd2015-09-22 14:51:42 -0700821#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
822 errno = 0;
823#endif
Steve Dowerd9ef74e2015-05-22 15:08:34 -0700824 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 buflen = format_time(outbuf, i, fmt, &buf);
Steve Dowerd9ef74e2015-05-22 15:08:34 -0700826 _Py_END_SUPPRESS_IPH
Victor Stinner136ea492011-12-17 22:37:18 +0100827#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Steve Dower97cded92015-09-08 19:12:51 -0700828 /* VisualStudio .NET 2005 does this properly */
829 if (buflen == 0 && errno == EINVAL) {
830 PyErr_SetString(PyExc_ValueError, "Invalid format string");
831 PyMem_Free(outbuf);
832 break;
833 }
Victor Stinner136ea492011-12-17 22:37:18 +0100834#endif
Steve Dower97cded92015-09-08 19:12:51 -0700835 if (buflen > 0 || i >= 256 * fmtlen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 /* If the buffer is 256 times as long as the format,
837 it's probably not failing for lack of room!
838 More likely, the format yields an empty result,
839 e.g. an empty format, or %Z when the timezone
840 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000841#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000843#else
Victor Stinner7ed7aea2018-01-15 10:45:49 +0100844 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen, "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000847 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 }
849 PyMem_Free(outbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000851#ifdef HAVE_WCSFTIME
852 PyMem_Free(format);
853#else
854 Py_DECREF(format);
855#endif
856 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000857}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000858
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000859#undef time_char
860#undef format_time
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000861PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000862"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000863\n\
864Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000865See the library reference manual for formatting codes. When the time tuple\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400866is not present, current time as returned by localtime() is used.\n\
867\n" STRFTIME_FORMAT_CODES);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000868#endif /* HAVE_STRFTIME */
869
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000870static PyObject *
871time_strptime(PyObject *self, PyObject *args)
872{
Victor Stinnerdbe28d22016-12-09 00:38:53 +0100873 PyObject *module, *func, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200874 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000875
Victor Stinnerdbe28d22016-12-09 00:38:53 +0100876 module = PyImport_ImportModuleNoBlock("_strptime");
877 if (!module)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 return NULL;
Victor Stinnerdbe28d22016-12-09 00:38:53 +0100879
880 func = _PyObject_GetAttrId(module, &PyId__strptime_time);
881 Py_DECREF(module);
882 if (!func) {
883 return NULL;
884 }
885
886 result = PyObject_Call(func, args, NULL);
887 Py_DECREF(func);
888 return result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000889}
890
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000892PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000893"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000894\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000895Parse a string to a time tuple according to a format specification.\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400896See the library reference manual for formatting codes (same as\n\
897strftime()).\n\
898\n" STRFTIME_FORMAT_CODES);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000899
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000900static PyObject *
901_asctime(struct tm *timeptr)
902{
903 /* Inspired by Open Group reference implementation available at
904 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200905 static const char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000906 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
907 };
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200908 static const char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000909 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
910 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
911 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100912 return PyUnicode_FromFormat(
913 "%s %s%3d %.2d:%.2d:%.2d %d",
914 wday_name[timeptr->tm_wday],
915 mon_name[timeptr->tm_mon],
916 timeptr->tm_mday, timeptr->tm_hour,
917 timeptr->tm_min, timeptr->tm_sec,
918 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000919}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000920
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000921static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000922time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 PyObject *tup = NULL;
925 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
928 return NULL;
929 if (tup == NULL) {
930 time_t tt = time(NULL);
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400931 if (_PyTime_localtime(tt, &buf) != 0)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100932 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +0300933 }
934 else if (!gettmarg(tup, &buf,
935 "iiiiiiiii;asctime(): illegal time tuple argument") ||
936 !checktm(&buf))
937 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +0300939 }
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000940 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000941}
942
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000943PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000944"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000945\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000946Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
947When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000948is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000949
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000950static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000951time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100954 struct tm buf;
955 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 return NULL;
Alexander Belopolsky3e7a3cb2016-09-28 17:31:35 -0400957 if (_PyTime_localtime(tt, &buf) != 0)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000958 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100959 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000960}
961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000962PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000963"ctime(seconds) -> string\n\
964\n\
965Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000966This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000967not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000968
Guido van Rossum60cd8131998-03-06 17:16:21 +0000969#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000970static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100971time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 struct tm buf;
974 time_t tt;
Oren Milman1d1d3e92017-08-20 18:35:36 +0300975 if (!gettmarg(tup, &buf,
976 "iiiiiiiii;mktime(): illegal time tuple argument"))
977 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +0300979 }
Victor Stinner1ac42612014-02-21 09:27:17 +0100980#ifdef _AIX
981 /* year < 1902 or year > 2037 */
982 if (buf.tm_year < 2 || buf.tm_year > 137) {
983 /* Issue #19748: On AIX, mktime() doesn't report overflow error for
984 * timestamp < -2^31 or timestamp > 2**31-1. */
985 PyErr_SetString(PyExc_OverflowError,
986 "mktime argument out of range");
987 return NULL;
988 }
989#else
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000990 buf.tm_wday = -1; /* sentinel; original value ignored */
Victor Stinner1ac42612014-02-21 09:27:17 +0100991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000993 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200994 * cannot remain set to -1 if mktime succeeded. */
Victor Stinner93037492013-06-25 22:54:35 +0200995 if (tt == (time_t)(-1)
996#ifndef _AIX
997 /* Return value of -1 does not necessarily mean an error, but
998 * tm_wday cannot remain set to -1 if mktime succeeded. */
999 && buf.tm_wday == -1
1000#else
1001 /* on AIX, tm_wday is always sets, even on error */
1002#endif
1003 )
1004 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 PyErr_SetString(PyExc_OverflowError,
1006 "mktime argument out of range");
1007 return NULL;
1008 }
Victor Stinner4195b5c2012-02-08 23:03:19 +01001009 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +00001010}
Guido van Rossum0ef577b1998-06-27 20:38:36 +00001011
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001012PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +00001013"mktime(tuple) -> floating point number\n\
1014\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -04001015Convert a time tuple in local time to seconds since the Epoch.\n\
1016Note that mktime(gmtime(0)) will not generally return zero for most\n\
1017time zones; instead the returned value will either be equal to that\n\
1018of the timezone or altzone attributes on the time module.");
Guido van Rossum60cd8131998-03-06 17:16:21 +00001019#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +00001020
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001021#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +00001022static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001023
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001024static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001025time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 m = PyImport_ImportModuleNoBlock("time");
1030 if (m == NULL) {
1031 return NULL;
1032 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 /* Reset timezone, altzone, daylight and tzname */
1037 PyInit_timezone(m);
1038 Py_DECREF(m);
Victor Stinner2ff51b82013-07-17 21:42:45 +02001039 if (PyErr_Occurred())
1040 return NULL;
Tim Peters1b6f7a92004-06-20 02:50:16 +00001041
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001042 Py_RETURN_NONE;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001043}
1044
1045PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +00001046"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001047\n\
1048Initialize, or reinitialize, the local timezone to the value stored in\n\
1049os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +00001050standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001051(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
1052fall back to UTC. If the TZ environment variable is not set, the local\n\
1053timezone is set to the systems best guess of wallclock time.\n\
1054Changing the TZ environment variable without calling tzset *may* change\n\
1055the local timezone used by methods such as localtime, but this behaviour\n\
1056should not be relied on.");
1057#endif /* HAVE_WORKING_TZSET */
1058
Victor Stinnerae586492014-09-02 23:18:25 +02001059static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +02001060time_monotonic(PyObject *self, PyObject *unused)
Victor Stinner071eca32012-03-15 01:17:09 +01001061{
Victor Stinnerc29b5852017-11-02 07:28:27 -07001062 _PyTime_t t = _PyTime_GetMonotonicClock();
1063 return _PyFloat_FromPyTime(t);
Victor Stinner071eca32012-03-15 01:17:09 +01001064}
1065
Victor Stinnerec895392012-04-29 02:41:27 +02001066PyDoc_STRVAR(monotonic_doc,
1067"monotonic() -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +01001068\n\
Victor Stinnerec895392012-04-29 02:41:27 +02001069Monotonic clock, cannot go backward.");
Victor Stinnerec919cc2012-03-15 00:58:32 +01001070
Victor Stinnerec895392012-04-29 02:41:27 +02001071static PyObject *
Victor Stinnerc29b5852017-11-02 07:28:27 -07001072time_monotonic_ns(PyObject *self, PyObject *unused)
1073{
1074 _PyTime_t t = _PyTime_GetMonotonicClock();
1075 return _PyTime_AsNanosecondsObject(t);
1076}
1077
1078PyDoc_STRVAR(monotonic_ns_doc,
1079"monotonic_ns() -> int\n\
1080\n\
1081Monotonic clock, cannot go backward, as nanoseconds.");
1082
1083static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +02001084time_perf_counter(PyObject *self, PyObject *unused)
1085{
1086 return perf_counter(NULL);
1087}
1088
1089PyDoc_STRVAR(perf_counter_doc,
1090"perf_counter() -> float\n\
1091\n\
1092Performance counter for benchmarking.");
1093
Victor Stinnerc29b5852017-11-02 07:28:27 -07001094static PyObject *
1095time_perf_counter_ns(PyObject *self, PyObject *unused)
1096{
1097 _PyTime_t t = _PyTime_GetPerfCounter();
1098 return _PyTime_AsNanosecondsObject(t);
1099}
1100
1101PyDoc_STRVAR(perf_counter_ns_doc,
1102"perf_counter_ns() -> int\n\
1103\n\
1104Performance counter for benchmarking as nanoseconds.");
1105
1106static int
1107_PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
Victor Stinnerec895392012-04-29 02:41:27 +02001108{
1109#if defined(MS_WINDOWS)
1110 HANDLE process;
1111 FILETIME creation_time, exit_time, kernel_time, user_time;
1112 ULARGE_INTEGER large;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001113 _PyTime_t ktime, utime, t;
Victor Stinnerec895392012-04-29 02:41:27 +02001114 BOOL ok;
1115
1116 process = GetCurrentProcess();
Victor Stinnerc29b5852017-11-02 07:28:27 -07001117 ok = GetProcessTimes(process, &creation_time, &exit_time,
1118 &kernel_time, &user_time);
1119 if (!ok) {
1120 PyErr_SetFromWindowsErr(0);
1121 return -1;
1122 }
Victor Stinnerec895392012-04-29 02:41:27 +02001123
Victor Stinnerec895392012-04-29 02:41:27 +02001124 if (info) {
1125 info->implementation = "GetProcessTimes()";
1126 info->resolution = 1e-7;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001127 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001128 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001129 }
Victor Stinnerc29b5852017-11-02 07:28:27 -07001130
1131 large.u.LowPart = kernel_time.dwLowDateTime;
1132 large.u.HighPart = kernel_time.dwHighDateTime;
1133 ktime = large.QuadPart;
1134
1135 large.u.LowPart = user_time.dwLowDateTime;
1136 large.u.HighPart = user_time.dwHighDateTime;
1137 utime = large.QuadPart;
1138
1139 /* ktime and utime have a resolution of 100 nanoseconds */
1140 t = _PyTime_FromNanoseconds((ktime + utime) * 100);
1141 *tp = t;
1142 return 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001143#else
1144
Victor Stinnerc29b5852017-11-02 07:28:27 -07001145 /* clock_gettime */
Victor Stinnerec895392012-04-29 02:41:27 +02001146#if defined(HAVE_CLOCK_GETTIME) \
1147 && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
Victor Stinnerc29b5852017-11-02 07:28:27 -07001148 struct timespec ts;
Victor Stinnerec895392012-04-29 02:41:27 +02001149#ifdef CLOCK_PROF
1150 const clockid_t clk_id = CLOCK_PROF;
1151 const char *function = "clock_gettime(CLOCK_PROF)";
1152#else
1153 const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID;
1154 const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)";
1155#endif
1156
Victor Stinnerc29b5852017-11-02 07:28:27 -07001157 if (clock_gettime(clk_id, &ts) == 0) {
Victor Stinnerec895392012-04-29 02:41:27 +02001158 if (info) {
1159 struct timespec res;
1160 info->implementation = function;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001161 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001162 info->adjustable = 0;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001163 if (clock_getres(clk_id, &res)) {
1164 PyErr_SetFromErrno(PyExc_OSError);
1165 return -1;
1166 }
1167 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
Victor Stinnerec895392012-04-29 02:41:27 +02001168 }
Victor Stinnerc29b5852017-11-02 07:28:27 -07001169
1170 if (_PyTime_FromTimespec(tp, &ts) < 0) {
1171 return -1;
1172 }
1173 return 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001174 }
1175#endif
1176
Victor Stinnerc29b5852017-11-02 07:28:27 -07001177 /* getrusage(RUSAGE_SELF) */
Victor Stinnerec895392012-04-29 02:41:27 +02001178#if defined(HAVE_SYS_RESOURCE_H)
Victor Stinnerc29b5852017-11-02 07:28:27 -07001179 struct rusage ru;
1180
Victor Stinnerec895392012-04-29 02:41:27 +02001181 if (getrusage(RUSAGE_SELF, &ru) == 0) {
Victor Stinnerc29b5852017-11-02 07:28:27 -07001182 _PyTime_t utime, stime;
1183
Victor Stinnerec895392012-04-29 02:41:27 +02001184 if (info) {
1185 info->implementation = "getrusage(RUSAGE_SELF)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001186 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001187 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001188 info->resolution = 1e-6;
1189 }
Victor Stinnerc29b5852017-11-02 07:28:27 -07001190
1191 if (_PyTime_FromTimeval(&utime, &ru.ru_utime) < 0) {
1192 return -1;
1193 }
1194 if (_PyTime_FromTimeval(&stime, &ru.ru_stime) < 0) {
1195 return -1;
1196 }
1197
1198 _PyTime_t total = utime + utime;
1199 *tp = total;
1200 return 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001201 }
1202#endif
1203
Victor Stinnerc29b5852017-11-02 07:28:27 -07001204 /* times() */
Victor Stinnerec895392012-04-29 02:41:27 +02001205#ifdef HAVE_TIMES
Victor Stinnerc29b5852017-11-02 07:28:27 -07001206 struct tms t;
1207
Victor Stinnerec895392012-04-29 02:41:27 +02001208 if (times(&t) != (clock_t)-1) {
Victor Stinnerc29b5852017-11-02 07:28:27 -07001209 static long ticks_per_second = -1;
Victor Stinnerec895392012-04-29 02:41:27 +02001210
1211 if (ticks_per_second == -1) {
Victor Stinnerc29b5852017-11-02 07:28:27 -07001212 long freq;
Victor Stinnerec895392012-04-29 02:41:27 +02001213#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
Victor Stinnerc29b5852017-11-02 07:28:27 -07001214 freq = sysconf(_SC_CLK_TCK);
1215 if (freq < 1) {
1216 freq = -1;
1217 }
Victor Stinnerec895392012-04-29 02:41:27 +02001218#elif defined(HZ)
Victor Stinnerc29b5852017-11-02 07:28:27 -07001219 freq = HZ;
Victor Stinnerec895392012-04-29 02:41:27 +02001220#else
Victor Stinnerc29b5852017-11-02 07:28:27 -07001221 freq = 60; /* magic fallback value; may be bogus */
Victor Stinnerec895392012-04-29 02:41:27 +02001222#endif
Victor Stinnerc29b5852017-11-02 07:28:27 -07001223
1224 if (freq != -1) {
1225 /* check that _PyTime_MulDiv(t, SEC_TO_NS, ticks_per_second)
1226 cannot overflow below */
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02001227#if LONG_MAX > _PyTime_MAX / SEC_TO_NS
Victor Stinnerc29b5852017-11-02 07:28:27 -07001228 if ((_PyTime_t)freq > _PyTime_MAX / SEC_TO_NS) {
1229 PyErr_SetString(PyExc_OverflowError,
1230 "_SC_CLK_TCK is too large");
1231 return -1;
1232 }
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02001233#endif
Victor Stinnerc29b5852017-11-02 07:28:27 -07001234
1235 ticks_per_second = freq;
1236 }
Victor Stinnerec895392012-04-29 02:41:27 +02001237 }
1238
1239 if (ticks_per_second != -1) {
Victor Stinnerec895392012-04-29 02:41:27 +02001240 if (info) {
1241 info->implementation = "times()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001242 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001243 info->adjustable = 0;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001244 info->resolution = 1.0 / (double)ticks_per_second;
Victor Stinnerec895392012-04-29 02:41:27 +02001245 }
Victor Stinnerc29b5852017-11-02 07:28:27 -07001246
1247 _PyTime_t total;
1248 total = _PyTime_MulDiv(t.tms_utime, SEC_TO_NS, ticks_per_second);
1249 total += _PyTime_MulDiv(t.tms_stime, SEC_TO_NS, ticks_per_second);
1250 *tp = total;
1251 return 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001252 }
1253 }
1254#endif
1255
Victor Stinnerc29b5852017-11-02 07:28:27 -07001256 /* clock */
Victor Stinner53e22bf2016-07-08 17:55:01 +02001257 /* Currently, Python 3 requires clock() to build: see issue #22624 */
Victor Stinnerc29b5852017-11-02 07:28:27 -07001258 return _PyTime_GetClockWithInfo(tp, info);
Victor Stinnerec895392012-04-29 02:41:27 +02001259#endif
1260}
1261
1262static PyObject *
1263time_process_time(PyObject *self, PyObject *unused)
1264{
Victor Stinnerc29b5852017-11-02 07:28:27 -07001265 _PyTime_t t;
1266 if (_PyTime_GetProcessTimeWithInfo(&t, NULL) < 0) {
1267 return NULL;
1268 }
1269 return _PyFloat_FromPyTime(t);
Victor Stinnerec895392012-04-29 02:41:27 +02001270}
1271
1272PyDoc_STRVAR(process_time_doc,
1273"process_time() -> float\n\
1274\n\
1275Process time for profiling: sum of the kernel and user-space CPU time.");
1276
Victor Stinnerc29b5852017-11-02 07:28:27 -07001277static PyObject *
1278time_process_time_ns(PyObject *self, PyObject *unused)
1279{
1280 _PyTime_t t;
1281 if (_PyTime_GetProcessTimeWithInfo(&t, NULL) < 0) {
1282 return NULL;
1283 }
1284 return _PyTime_AsNanosecondsObject(t);
1285}
1286
1287PyDoc_STRVAR(process_time_ns_doc,
1288"process_time() -> int\n\
1289\n\
1290Process time for profiling as nanoseconds:\n\
1291sum of the kernel and user-space CPU time.");
1292
Victor Stinnerec895392012-04-29 02:41:27 +02001293
Antoine Pitrou4bd41c92017-11-15 22:52:21 +01001294#if defined(MS_WINDOWS)
1295#define HAVE_THREAD_TIME
1296static int
1297_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
1298{
1299 HANDLE thread;
1300 FILETIME creation_time, exit_time, kernel_time, user_time;
1301 ULARGE_INTEGER large;
1302 _PyTime_t ktime, utime, t;
1303 BOOL ok;
1304
1305 thread = GetCurrentThread();
1306 ok = GetThreadTimes(thread, &creation_time, &exit_time,
1307 &kernel_time, &user_time);
1308 if (!ok) {
1309 PyErr_SetFromWindowsErr(0);
1310 return -1;
1311 }
1312
1313 if (info) {
1314 info->implementation = "GetThreadTimes()";
1315 info->resolution = 1e-7;
1316 info->monotonic = 1;
1317 info->adjustable = 0;
1318 }
1319
1320 large.u.LowPart = kernel_time.dwLowDateTime;
1321 large.u.HighPart = kernel_time.dwHighDateTime;
1322 ktime = large.QuadPart;
1323
1324 large.u.LowPart = user_time.dwLowDateTime;
1325 large.u.HighPart = user_time.dwHighDateTime;
1326 utime = large.QuadPart;
1327
1328 /* ktime and utime have a resolution of 100 nanoseconds */
1329 t = _PyTime_FromNanoseconds((ktime + utime) * 100);
1330 *tp = t;
1331 return 0;
1332}
1333
1334#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID)
1335#define HAVE_THREAD_TIME
1336static int
1337_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
1338{
1339 struct timespec ts;
1340 const clockid_t clk_id = CLOCK_THREAD_CPUTIME_ID;
1341 const char *function = "clock_gettime(CLOCK_THREAD_CPUTIME_ID)";
1342
1343 if (clock_gettime(clk_id, &ts)) {
1344 PyErr_SetFromErrno(PyExc_OSError);
1345 return -1;
1346 }
1347 if (info) {
1348 struct timespec res;
1349 info->implementation = function;
1350 info->monotonic = 1;
1351 info->adjustable = 0;
1352 if (clock_getres(clk_id, &res)) {
1353 PyErr_SetFromErrno(PyExc_OSError);
1354 return -1;
1355 }
1356 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
1357 }
1358
1359 if (_PyTime_FromTimespec(tp, &ts) < 0) {
1360 return -1;
1361 }
1362 return 0;
1363}
1364#endif
1365
1366#ifdef HAVE_THREAD_TIME
1367static PyObject *
1368time_thread_time(PyObject *self, PyObject *unused)
1369{
1370 _PyTime_t t;
1371 if (_PyTime_GetThreadTimeWithInfo(&t, NULL) < 0) {
1372 return NULL;
1373 }
1374 return _PyFloat_FromPyTime(t);
1375}
1376
1377PyDoc_STRVAR(thread_time_doc,
1378"thread_time() -> float\n\
1379\n\
1380Thread time for profiling: sum of the kernel and user-space CPU time.");
1381
1382static PyObject *
1383time_thread_time_ns(PyObject *self, PyObject *unused)
1384{
1385 _PyTime_t t;
1386 if (_PyTime_GetThreadTimeWithInfo(&t, NULL) < 0) {
1387 return NULL;
1388 }
1389 return _PyTime_AsNanosecondsObject(t);
1390}
1391
1392PyDoc_STRVAR(thread_time_ns_doc,
1393"thread_time() -> int\n\
1394\n\
1395Thread time for profiling as nanoseconds:\n\
1396sum of the kernel and user-space CPU time.");
1397#endif
1398
1399
Victor Stinnerec895392012-04-29 02:41:27 +02001400static PyObject *
1401time_get_clock_info(PyObject *self, PyObject *args)
1402{
1403 char *name;
Victor Stinnerec895392012-04-29 02:41:27 +02001404 _Py_clock_info_t info;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001405 PyObject *obj = NULL, *dict, *ns;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001406 _PyTime_t t;
Victor Stinnerec895392012-04-29 02:41:27 +02001407
Victor Stinnerc29b5852017-11-02 07:28:27 -07001408 if (!PyArg_ParseTuple(args, "s:get_clock_info", &name)) {
Victor Stinnerec895392012-04-29 02:41:27 +02001409 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001410 }
Victor Stinnerec895392012-04-29 02:41:27 +02001411
1412#ifdef Py_DEBUG
1413 info.implementation = NULL;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001414 info.monotonic = -1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001415 info.adjustable = -1;
Victor Stinnerec895392012-04-29 02:41:27 +02001416 info.resolution = -1.0;
1417#else
1418 info.implementation = "";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001419 info.monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001420 info.adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001421 info.resolution = 1.0;
1422#endif
1423
Victor Stinnerc29b5852017-11-02 07:28:27 -07001424 if (strcmp(name, "time") == 0) {
1425 if (_PyTime_GetSystemClockWithInfo(&t, &info) < 0) {
1426 return NULL;
1427 }
1428 }
Victor Stinnerec895392012-04-29 02:41:27 +02001429#ifdef PYCLOCK
Victor Stinnerc29b5852017-11-02 07:28:27 -07001430 else if (strcmp(name, "clock") == 0) {
Victor Stinnerec895392012-04-29 02:41:27 +02001431 obj = pyclock(&info);
Victor Stinnerc29b5852017-11-02 07:28:27 -07001432 if (obj == NULL) {
1433 return NULL;
1434 }
1435 Py_DECREF(obj);
1436 }
Victor Stinnerec895392012-04-29 02:41:27 +02001437#endif
Victor Stinnerc29b5852017-11-02 07:28:27 -07001438 else if (strcmp(name, "monotonic") == 0) {
1439 if (_PyTime_GetMonotonicClockWithInfo(&t, &info) < 0) {
1440 return NULL;
1441 }
1442 }
1443 else if (strcmp(name, "perf_counter") == 0) {
1444 if (_PyTime_GetPerfCounterWithInfo(&t, &info) < 0) {
1445 return NULL;
1446 }
1447 }
1448 else if (strcmp(name, "process_time") == 0) {
1449 if (_PyTime_GetProcessTimeWithInfo(&t, &info) < 0) {
1450 return NULL;
1451 }
1452 }
Antoine Pitrou4bd41c92017-11-15 22:52:21 +01001453#ifdef HAVE_THREAD_TIME
1454 else if (strcmp(name, "thread_time") == 0) {
1455 if (_PyTime_GetThreadTimeWithInfo(&t, &info) < 0) {
1456 return NULL;
1457 }
1458 }
1459#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001460 else {
1461 PyErr_SetString(PyExc_ValueError, "unknown clock");
1462 return NULL;
1463 }
Victor Stinnerec895392012-04-29 02:41:27 +02001464
Victor Stinnerbda4b882012-06-12 22:11:44 +02001465 dict = PyDict_New();
Victor Stinnerc29b5852017-11-02 07:28:27 -07001466 if (dict == NULL) {
Victor Stinnerec895392012-04-29 02:41:27 +02001467 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001468 }
Victor Stinnerec895392012-04-29 02:41:27 +02001469
1470 assert(info.implementation != NULL);
1471 obj = PyUnicode_FromString(info.implementation);
Victor Stinnerc29b5852017-11-02 07:28:27 -07001472 if (obj == NULL) {
Victor Stinnerec895392012-04-29 02:41:27 +02001473 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001474 }
1475 if (PyDict_SetItemString(dict, "implementation", obj) == -1) {
Victor Stinnerbda4b882012-06-12 22:11:44 +02001476 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001477 }
Victor Stinnerbda4b882012-06-12 22:11:44 +02001478 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001479
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001480 assert(info.monotonic != -1);
1481 obj = PyBool_FromLong(info.monotonic);
Victor Stinnerc29b5852017-11-02 07:28:27 -07001482 if (obj == NULL) {
Victor Stinnerec895392012-04-29 02:41:27 +02001483 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001484 }
1485 if (PyDict_SetItemString(dict, "monotonic", obj) == -1) {
Victor Stinnerbda4b882012-06-12 22:11:44 +02001486 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001487 }
Victor Stinnerbda4b882012-06-12 22:11:44 +02001488 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001489
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001490 assert(info.adjustable != -1);
1491 obj = PyBool_FromLong(info.adjustable);
Victor Stinnerc29b5852017-11-02 07:28:27 -07001492 if (obj == NULL) {
Victor Stinnerec895392012-04-29 02:41:27 +02001493 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001494 }
1495 if (PyDict_SetItemString(dict, "adjustable", obj) == -1) {
Victor Stinnerbda4b882012-06-12 22:11:44 +02001496 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001497 }
Victor Stinnerbda4b882012-06-12 22:11:44 +02001498 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001499
1500 assert(info.resolution > 0.0);
1501 assert(info.resolution <= 1.0);
1502 obj = PyFloat_FromDouble(info.resolution);
Victor Stinnerc29b5852017-11-02 07:28:27 -07001503 if (obj == NULL) {
Victor Stinnerec895392012-04-29 02:41:27 +02001504 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001505 }
1506 if (PyDict_SetItemString(dict, "resolution", obj) == -1) {
Victor Stinnerbda4b882012-06-12 22:11:44 +02001507 goto error;
Victor Stinnerc29b5852017-11-02 07:28:27 -07001508 }
Victor Stinnerbda4b882012-06-12 22:11:44 +02001509 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001510
Victor Stinnerbda4b882012-06-12 22:11:44 +02001511 ns = _PyNamespace_New(dict);
1512 Py_DECREF(dict);
1513 return ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001514
1515error:
Victor Stinnerbda4b882012-06-12 22:11:44 +02001516 Py_DECREF(dict);
1517 Py_XDECREF(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001518 return NULL;
1519}
1520
1521PyDoc_STRVAR(get_clock_info_doc,
1522"get_clock_info(name: str) -> dict\n\
1523\n\
1524Get information of the specified clock.");
Victor Stinner8b302012012-02-07 23:29:46 +01001525
Benjamin Petersonc510c6b2018-09-20 19:52:18 -07001526#ifndef HAVE_DECL_TZNAME
Victor Stinner1fb399b2018-09-17 13:56:17 -07001527static void
1528get_zone(char *zone, int n, struct tm *p)
1529{
1530#ifdef HAVE_STRUCT_TM_TM_ZONE
1531 strncpy(zone, p->tm_zone ? p->tm_zone : " ", n);
1532#else
1533 tzset();
1534 strftime(zone, n, "%Z", p);
1535#endif
1536}
1537
1538static int
1539get_gmtoff(time_t t, struct tm *p)
1540{
1541#ifdef HAVE_STRUCT_TM_TM_ZONE
1542 return p->tm_gmtoff;
1543#else
1544 return timegm(p) - t;
1545#endif
1546}
Benjamin Petersonc510c6b2018-09-20 19:52:18 -07001547#endif // !HAVE_DECL_TZNAME
Victor Stinner1fb399b2018-09-17 13:56:17 -07001548
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -04001549static void
Martin v. Löwis1a214512008-06-11 05:26:20 +00001550PyInit_timezone(PyObject *m) {
1551 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 time_tzset. In the future, some parts of it can be moved back
1553 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
1554 are), and the extraneous calls to tzset(3) should be removed.
1555 I haven't done this yet, as I don't want to change this code as
1556 little as possible when introducing the time.tzset and time.tzsetwall
1557 methods. This should simply be a method of doing the following once,
1558 at the top of this function and removing the call to tzset() from
1559 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 #ifdef HAVE_TZSET
1562 tzset()
1563 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001566 */
Benjamin Petersonc510c6b2018-09-20 19:52:18 -07001567#ifdef HAVE_DECL_TZNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 PyObject *otz0, *otz1;
1569 tzset();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001571#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001573#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner7ed7aea2018-01-15 10:45:49 +01001577 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
Benjamin Petersonc510c6b2018-09-20 19:52:18 -07001578 if (otz0 == NULL) {
1579 return;
Victor Stinner1fb399b2018-09-17 13:56:17 -07001580 }
Benjamin Petersonc510c6b2018-09-20 19:52:18 -07001581 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
1582 if (otz1 == NULL) {
1583 Py_DECREF(otz0);
1584 return;
1585 }
1586 PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1);
1587 if (tzname_obj == NULL)
1588 return;
1589 PyModule_AddObject(m, "tzname", tzname_obj);
1590#else // !HAVE_DECL_TZNAME
1591 static const time_t YEAR = (365 * 24 + 6) * 3600;
1592 time_t t;
1593 struct tm p;
1594 long janzone, julyzone;
1595 char janname[10], julyname[10];
1596 t = (time((time_t *)0) / YEAR) * YEAR;
1597 _PyTime_localtime(t, &p);
1598 get_zone(janname, 9, &p);
1599 janzone = -get_gmtoff(t, &p);
1600 janname[9] = '\0';
1601 t += YEAR/2;
1602 _PyTime_localtime(t, &p);
1603 get_zone(julyname, 9, &p);
1604 julyzone = -get_gmtoff(t, &p);
1605 julyname[9] = '\0';
1606
1607 PyObject *tzname_obj;
1608 if (janzone < julyzone) {
1609 /* DST is reversed in the southern hemisphere */
1610 PyModule_AddIntConstant(m, "timezone", julyzone);
1611 PyModule_AddIntConstant(m, "altzone", janzone);
1612 PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
1613 tzname_obj = Py_BuildValue("(zz)", julyname, janname);
1614 } else {
1615 PyModule_AddIntConstant(m, "timezone", janzone);
1616 PyModule_AddIntConstant(m, "altzone", julyzone);
1617 PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
1618 tzname_obj = Py_BuildValue("(zz)", janname, julyname);
1619 }
1620 if (tzname_obj == NULL)
1621 return;
1622 PyModule_AddObject(m, "tzname", tzname_obj);
1623#endif // !HAVE_DECL_TZNAME
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001624}
1625
1626
1627static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +01001628 {"time", time_time, METH_NOARGS, time_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001629 {"time_ns", time_time_ns, METH_NOARGS, time_ns_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001630#ifdef PYCLOCK
Victor Stinner4195b5c2012-02-08 23:03:19 +01001631 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001632#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001633#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001634 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001635 {"clock_gettime_ns",time_clock_gettime_ns, METH_VARARGS, clock_gettime_ns_doc},
Benjamin Peterson37098cd2016-09-13 22:55:09 -07001636#endif
1637#ifdef HAVE_CLOCK_SETTIME
Victor Stinner30d79472012-04-03 00:45:07 +02001638 {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001639 {"clock_settime_ns",time_clock_settime_ns, METH_VARARGS, clock_settime_ns_doc},
Benjamin Peterson37098cd2016-09-13 22:55:09 -07001640#endif
1641#ifdef HAVE_CLOCK_GETRES
Victor Stinner4195b5c2012-02-08 23:03:19 +01001642 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001643#endif
pdoxe14679c2017-10-05 00:01:56 -07001644#ifdef HAVE_PTHREAD_GETCPUCLOCKID
1645 {"pthread_getcpuclockid", time_pthread_getcpuclockid, METH_VARARGS, pthread_getcpuclockid_doc},
1646#endif
Victor Stinnercb29f012015-03-27 13:31:18 +01001647 {"sleep", time_sleep, METH_O, sleep_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
1649 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
1650 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
1651 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001652#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001653 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001654#endif
1655#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001659#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001661#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001662 {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001663 {"monotonic_ns", time_monotonic_ns, METH_NOARGS, monotonic_ns_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001664 {"process_time", time_process_time, METH_NOARGS, process_time_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001665 {"process_time_ns", time_process_time_ns, METH_NOARGS, process_time_ns_doc},
Antoine Pitrou4bd41c92017-11-15 22:52:21 +01001666#ifdef HAVE_THREAD_TIME
1667 {"thread_time", time_thread_time, METH_NOARGS, thread_time_doc},
1668 {"thread_time_ns", time_thread_time_ns, METH_NOARGS, thread_time_ns_doc},
1669#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001670 {"perf_counter", time_perf_counter, METH_NOARGS, perf_counter_doc},
Victor Stinnerc29b5852017-11-02 07:28:27 -07001671 {"perf_counter_ns", time_perf_counter_ns, METH_NOARGS, perf_counter_ns_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001672 {"get_clock_info", time_get_clock_info, METH_VARARGS, get_clock_info_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001674};
1675
1676
1677PyDoc_STRVAR(module_doc,
1678"This module provides various functions to manipulate time values.\n\
1679\n\
1680There are two standard representations of time. One is the number\n\
1681of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1682or a floating point number (to represent fractions of seconds).\n\
1683The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1684The actual value can be retrieved by calling gmtime(0).\n\
1685\n\
1686The other representation is a tuple of 9 integers giving local time.\n\
1687The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001688 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001689 month (1-12)\n\
1690 day (1-31)\n\
1691 hours (0-23)\n\
1692 minutes (0-59)\n\
1693 seconds (0-59)\n\
1694 weekday (0-6, Monday is 0)\n\
1695 Julian day (day in the year, 1-366)\n\
1696 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1697If the DST flag is 0, the time is given in the regular time zone;\n\
1698if it is 1, the time is given in the DST time zone;\n\
Cheryl Sabella703ff382017-10-11 09:29:14 -04001699if it is -1, mktime() should guess based on the date and time.\n");
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001700
1701
Martin v. Löwis1a214512008-06-11 05:26:20 +00001702
1703static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 PyModuleDef_HEAD_INIT,
1705 "time",
1706 module_doc,
1707 -1,
1708 time_methods,
1709 NULL,
1710 NULL,
1711 NULL,
1712 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001713};
1714
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001715PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001716PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 m = PyModule_Create(&timemodule);
1720 if (m == NULL)
1721 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 /* Set, or reset, module variables like time.timezone */
1724 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001725
Max Bélanger94451182018-10-20 17:07:54 -07001726#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES)
1727
Benjamin Peterson37098cd2016-09-13 22:55:09 -07001728#ifdef CLOCK_REALTIME
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -04001729 PyModule_AddIntMacro(m, CLOCK_REALTIME);
Benjamin Peterson37098cd2016-09-13 22:55:09 -07001730#endif
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -04001731#ifdef CLOCK_MONOTONIC
1732 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
1733#endif
1734#ifdef CLOCK_MONOTONIC_RAW
1735 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
1736#endif
1737#ifdef CLOCK_HIGHRES
1738 PyModule_AddIntMacro(m, CLOCK_HIGHRES);
1739#endif
1740#ifdef CLOCK_PROCESS_CPUTIME_ID
1741 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
1742#endif
1743#ifdef CLOCK_THREAD_CPUTIME_ID
1744 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
1745#endif
Victor Stinnera64ce972017-11-02 04:19:19 -07001746#ifdef CLOCK_PROF
1747 PyModule_AddIntMacro(m, CLOCK_PROF);
1748#endif
1749#ifdef CLOCK_BOOTTIME
1750 PyModule_AddIntMacro(m, CLOCK_BOOTTIME);
1751#endif
1752#ifdef CLOCK_UPTIME
1753 PyModule_AddIntMacro(m, CLOCK_UPTIME);
1754#endif
Alexander Belopolsky18f3a9b2016-09-11 22:55:16 -04001755
Max Bélanger94451182018-10-20 17:07:54 -07001756#endif /* defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) */
1757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 if (!initialized) {
Victor Stinner1c8f0592013-07-22 22:24:54 +02001759 if (PyStructSequence_InitType2(&StructTimeType,
1760 &struct_time_type_desc) < 0)
1761 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 }
1763 Py_INCREF(&StructTimeType);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -04001764 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1766 initialized = 1;
Benjamin Peterson5633c4f2018-09-14 09:09:04 -07001767
1768#if defined(__linux__) && !defined(__GLIBC__)
1769 struct tm tm;
Benjamin Petersonb93062b2018-09-14 10:39:13 -07001770 const time_t zero = 0;
1771 if (gmtime_r(&zero, &tm) != NULL)
Benjamin Peterson5633c4f2018-09-14 09:09:04 -07001772 utc_string = tm.tm_zone;
1773#endif
1774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001776}
1777
Victor Stinnercb29f012015-03-27 13:31:18 +01001778/* Implement pysleep() for various platforms.
Guido van Rossumb6775db1994-08-01 11:34:53 +00001779 When interrupted (or when another error occurs), return -1 and
1780 set an exception; else return 0. */
1781
1782static int
Victor Stinnercb29f012015-03-27 13:31:18 +01001783pysleep(_PyTime_t secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001784{
Victor Stinnercb29f012015-03-27 13:31:18 +01001785 _PyTime_t deadline, monotonic;
Victor Stinner79d68f92015-03-19 21:54:09 +01001786#ifndef MS_WINDOWS
1787 struct timeval timeout;
Victor Stinner79d68f92015-03-19 21:54:09 +01001788 int err = 0;
1789#else
Victor Stinnercb29f012015-03-27 13:31:18 +01001790 _PyTime_t millisecs;
Victor Stinner79d68f92015-03-19 21:54:09 +01001791 unsigned long ul_millis;
1792 DWORD rc;
1793 HANDLE hInterruptEvent;
Victor Stinner0c2fd892015-03-17 10:49:17 +01001794#endif
Victor Stinner79d68f92015-03-19 21:54:09 +01001795
Victor Stinnercb29f012015-03-27 13:31:18 +01001796 deadline = _PyTime_GetMonotonicClock() + secs;
Victor Stinner79d68f92015-03-19 21:54:09 +01001797
1798 do {
1799#ifndef MS_WINDOWS
Victor Stinner869e1772015-03-30 03:49:14 +02001800 if (_PyTime_AsTimeval(secs, &timeout, _PyTime_ROUND_CEILING) < 0)
Victor Stinnercb29f012015-03-27 13:31:18 +01001801 return -1;
Victor Stinner79d68f92015-03-19 21:54:09 +01001802
1803 Py_BEGIN_ALLOW_THREADS
1804 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout);
1805 Py_END_ALLOW_THREADS
1806
1807 if (err == 0)
1808 break;
1809
1810 if (errno != EINTR) {
Victor Stinner0c2fd892015-03-17 10:49:17 +01001811 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 return -1;
1813 }
Victor Stinner79d68f92015-03-19 21:54:09 +01001814#else
Victor Stinner869e1772015-03-30 03:49:14 +02001815 millisecs = _PyTime_AsMilliseconds(secs, _PyTime_ROUND_CEILING);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 if (millisecs > (double)ULONG_MAX) {
1817 PyErr_SetString(PyExc_OverflowError,
1818 "sleep length is too large");
1819 return -1;
1820 }
Victor Stinner79d68f92015-03-19 21:54:09 +01001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1823 * by Guido, only the main thread can be interrupted.
1824 */
1825 ul_millis = (unsigned long)millisecs;
Victor Stinner79d68f92015-03-19 21:54:09 +01001826 if (ul_millis == 0 || !_PyOS_IsMainThread()) {
1827 Py_BEGIN_ALLOW_THREADS
Victor Stinner0eac1302015-03-20 03:06:12 +01001828 Sleep(ul_millis);
Victor Stinner79d68f92015-03-19 21:54:09 +01001829 Py_END_ALLOW_THREADS
1830 break;
Victor Stinner945c82e2015-03-12 16:19:01 +01001831 }
Victor Stinner79d68f92015-03-19 21:54:09 +01001832
1833 hInterruptEvent = _PyOS_SigintEvent();
1834 ResetEvent(hInterruptEvent);
1835
1836 Py_BEGIN_ALLOW_THREADS
1837 rc = WaitForSingleObjectEx(hInterruptEvent, ul_millis, FALSE);
Victor Stinner0c2fd892015-03-17 10:49:17 +01001838 Py_END_ALLOW_THREADS
Victor Stinner79d68f92015-03-19 21:54:09 +01001839
1840 if (rc != WAIT_OBJECT_0)
1841 break;
Victor Stinner945c82e2015-03-12 16:19:01 +01001842#endif
Victor Stinner0c2fd892015-03-17 10:49:17 +01001843
Victor Stinner79d68f92015-03-19 21:54:09 +01001844 /* sleep was interrupted by SIGINT */
1845 if (PyErr_CheckSignals())
1846 return -1;
1847
Victor Stinnercb29f012015-03-27 13:31:18 +01001848 monotonic = _PyTime_GetMonotonicClock();
1849 secs = deadline - monotonic;
Victor Stinner6aa446c2015-03-30 21:33:51 +02001850 if (secs < 0)
Victor Stinner79d68f92015-03-19 21:54:09 +01001851 break;
1852 /* retry with the recomputed delay */
1853 } while (1);
1854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001856}