blob: 2e480071bc04b6dbe42baa82a07c3cf7fa89667a [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
Guido van Rossum7bf22de1997-12-02 20:34:19 +000023#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000024#include <i86.h>
25#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000026#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000027#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000028#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000029#include "pythread.h"
30
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000031#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000032/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000033#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000034#define tzname _tzname
35#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000036#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000037#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000038#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000039
Victor Stinnera8ec5ea2012-03-13 00:25:42 +010040#if defined(__APPLE__)
41#include <mach/mach_time.h>
42#endif
43
Guido van Rossum234f9421993-06-17 12:35:49 +000044/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static int floatsleep(double);
Victor Stinnerec895392012-04-29 02:41:27 +020046static PyObject* floattime(_Py_clock_info_t *info);
47
48#ifdef MS_WINDOWS
49static OSVERSIONINFOEX winver;
50#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000052static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +010053time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Victor Stinnerec895392012-04-29 02:41:27 +020055 return floattime(NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +000056}
57
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000058PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010059"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000060\n\
61Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000062Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000063
Victor Stinner85fdfa82012-01-27 00:38:48 +010064#if defined(HAVE_CLOCK)
65
66#ifndef CLOCKS_PER_SEC
67#ifdef CLK_TCK
68#define CLOCKS_PER_SEC CLK_TCK
69#else
70#define CLOCKS_PER_SEC 1000000
71#endif
72#endif
73
Victor Stinner4195b5c2012-02-08 23:03:19 +010074static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +020075floatclock(_Py_clock_info_t *info)
Victor Stinner85fdfa82012-01-27 00:38:48 +010076{
Victor Stinner4195b5c2012-02-08 23:03:19 +010077 clock_t value;
78 value = clock();
79 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010080 PyErr_SetString(PyExc_RuntimeError,
81 "the processor time used is not available "
82 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010083 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010084 }
Victor Stinnerec895392012-04-29 02:41:27 +020085 if (info) {
86 info->implementation = "clock()";
87 info->resolution = 1.0 / (double)CLOCKS_PER_SEC;
Benjamin Peterson49a69e42012-05-01 09:38:34 -040088 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +020089 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +020090 }
Victor Stinner4195b5c2012-02-08 23:03:19 +010091 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +010092}
93#endif /* HAVE_CLOCK */
94
Thomas Wouters477c8d52006-05-27 19:21:47 +000095#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinnerec895392012-04-29 02:41:27 +020096#define WIN32_PERF_COUNTER
Victor Stinner9122fdd2011-07-04 13:55:40 +020097/* Win32 has better clock replacement; we have our own version, due to Mark
98 Hammond and Tim Peters */
Victor Stinnerec895392012-04-29 02:41:27 +020099static int
100win_perf_counter(_Py_clock_info_t *info, PyObject **result)
Guido van Rossum3917c221997-04-02 05:35:28 +0000101{
Victor Stinner8b302012012-02-07 23:29:46 +0100102 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100103 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100105 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000106
Victor Stinner8b302012012-02-07 23:29:46 +0100107 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100109 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100110 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
112 /* Unlikely to happen - this works on all intel
113 machines at least! Revert to clock() */
Victor Stinnerec895392012-04-29 02:41:27 +0200114 *result = NULL;
115 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 }
Victor Stinner8b302012012-02-07 23:29:46 +0100117 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 }
119 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100120 diff = (double)(now.QuadPart - ctrStart);
Victor Stinnerec895392012-04-29 02:41:27 +0200121 if (info) {
122 info->implementation = "QueryPerformanceCounter()";
123 info->resolution = 1.0 / (double)cpu_frequency;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400124 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200125 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200126 }
127 *result = PyFloat_FromDouble(diff / (double)cpu_frequency);
128 return 0;
Guido van Rossum3917c221997-04-02 05:35:28 +0000129}
Victor Stinner8b302012012-02-07 23:29:46 +0100130#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000131
Victor Stinnerec895392012-04-29 02:41:27 +0200132#if defined(WIN32_PERF_COUNTER) || defined(HAVE_CLOCK)
133#define PYCLOCK
134static PyObject*
135pyclock(_Py_clock_info_t *info)
136{
137#ifdef WIN32_PERF_COUNTER
138 PyObject *res;
139 if (win_perf_counter(info, &res) == 0)
140 return res;
141#endif
142 return floatclock(info);
143}
144
Victor Stinner9122fdd2011-07-04 13:55:40 +0200145static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100146time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200147{
Victor Stinnerec895392012-04-29 02:41:27 +0200148 return pyclock(NULL);
Victor Stinner9122fdd2011-07-04 13:55:40 +0200149}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000151PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100152"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000153\n\
154Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000155the first call to clock(). This has as much precision as the system\n\
156records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000157#endif
158
Victor Stinnere0be4232011-10-25 13:06:09 +0200159#ifdef HAVE_CLOCK_GETTIME
160static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100161time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200162{
163 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200164 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200165 struct timespec tp;
166
Victor Stinner4195b5c2012-02-08 23:03:19 +0100167 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200168 return NULL;
169
170 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100171 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200172 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100173 return NULL;
174 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100175 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200176}
177
178PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100179"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200180\n\
181Return the time of the specified clock clk_id.");
Victor Stinner30d79472012-04-03 00:45:07 +0200182
183static PyObject *
184time_clock_settime(PyObject *self, PyObject *args)
185{
Victor Stinnerb8d01692012-04-13 23:44:05 +0200186 int clk_id;
Victor Stinner30d79472012-04-03 00:45:07 +0200187 PyObject *obj;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200188 time_t tv_sec;
189 long tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200190 struct timespec tp;
191 int ret;
192
193 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
194 return NULL;
195
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200196 if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec) == -1)
Victor Stinner30d79472012-04-03 00:45:07 +0200197 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200198 tp.tv_sec = tv_sec;
199 tp.tv_nsec = tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200200
201 ret = clock_settime((clockid_t)clk_id, &tp);
202 if (ret != 0) {
203 PyErr_SetFromErrno(PyExc_IOError);
204 return NULL;
205 }
206 Py_RETURN_NONE;
207}
208
209PyDoc_STRVAR(clock_settime_doc,
210"clock_settime(clk_id, time)\n\
211\n\
212Set the time of the specified clock clk_id.");
Victor Stinnere0be4232011-10-25 13:06:09 +0200213
Victor Stinnere0be4232011-10-25 13:06:09 +0200214static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100215time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200216{
217 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200218 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200219 struct timespec tp;
220
Victor Stinner4195b5c2012-02-08 23:03:19 +0100221 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200222 return NULL;
223
224 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100225 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200226 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100227 return NULL;
228 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100229
230 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200231}
232
233PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100234"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200235\n\
236Return the resolution (precision) of the specified clock clk_id.");
Victor Stinnerb8d01692012-04-13 23:44:05 +0200237#endif /* HAVE_CLOCK_GETTIME */
Victor Stinnere0be4232011-10-25 13:06:09 +0200238
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000239static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000240time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 double secs;
243 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
244 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200245 if (secs < 0) {
246 PyErr_SetString(PyExc_ValueError,
247 "sleep length must be non-negative");
248 return NULL;
249 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (floatsleep(secs) != 0)
251 return NULL;
252 Py_INCREF(Py_None);
253 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000256PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000257"sleep(seconds)\n\
258\n\
259Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000260a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000261
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000262static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000263 {"tm_year", "year, for example, 1993"},
264 {"tm_mon", "month of year, range [1, 12]"},
265 {"tm_mday", "day of month, range [1, 31]"},
266 {"tm_hour", "hours, range [0, 23]"},
267 {"tm_min", "minutes, range [0, 59]"},
268 {"tm_sec", "seconds, range [0, 61])"},
269 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
270 {"tm_yday", "day of year, range [1, 366]"},
271 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400272#ifdef HAVE_STRUCT_TM_TM_ZONE
273 {"tm_zone", "abbreviation of timezone name"},
274 {"tm_gmtoff", "offset from UTC in seconds"},
275#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000277};
278
279static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000281 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
282 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
283 " sequence of 9 integers.\n\n"
284 " Note that several fields' values are not the same as those defined by\n"
285 " the C language standard for struct tm. For example, the value of the\n"
286 " field tm_year is the actual year, not year - 1900. See individual\n"
287 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 struct_time_type_fields,
289 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000290};
Tim Peters9ad4b682002-02-13 05:14:18 +0000291
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000292static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000293static PyTypeObject StructTimeType;
294
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400295
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000296static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000297tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 PyObject *v = PyStructSequence_New(&StructTimeType);
300 if (v == NULL)
301 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000302
Christian Heimes217cfd12007-12-02 14:31:20 +0000303#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 SET(0, p->tm_year + 1900);
306 SET(1, p->tm_mon + 1); /* Want January == 1 */
307 SET(2, p->tm_mday);
308 SET(3, p->tm_hour);
309 SET(4, p->tm_min);
310 SET(5, p->tm_sec);
311 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
312 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
313 SET(8, p->tm_isdst);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400314#ifdef HAVE_STRUCT_TM_TM_ZONE
315 PyStructSequence_SET_ITEM(v, 9,
316 PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
317 SET(10, p->tm_gmtoff);
318#endif /* HAVE_STRUCT_TM_TM_ZONE */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000319#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 if (PyErr_Occurred()) {
321 Py_XDECREF(v);
322 return NULL;
323 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000326}
327
Fred Drakef901abd2004-08-03 17:58:55 +0000328/* Parse arg tuple that can contain an optional float-or-None value;
329 format needs to be "|O:name".
330 Returns non-zero on success (parallels PyArg_ParseTuple).
331*/
332static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100333parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100336 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 if (!PyArg_ParseTuple(args, format, &ot))
339 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100340 if (ot == NULL || ot == Py_None) {
341 whent = time(NULL);
342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100344 if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100345 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100347 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000349}
350
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000351static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000352time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000353{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100354 time_t when;
355 struct tm buf, *local;
356
357 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100359
360 errno = 0;
361 local = gmtime(&when);
362 if (local == NULL) {
363#ifdef EINVAL
364 if (errno == 0)
365 errno = EINVAL;
366#endif
367 return PyErr_SetFromErrno(PyExc_OSError);
368 }
369 buf = *local;
370 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000371}
372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000373PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000374"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000375 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000376\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000377Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400378GMT). When 'seconds' is not passed in, convert the current time instead.\n\
379\n\
380If the platform supports the tm_gmtoff and tm_zone, they are available as\n\
381attributes only.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000382
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100383static int
384pylocaltime(time_t *timep, struct tm *result)
385{
386 struct tm *local;
387
388 assert (timep != NULL);
389 local = localtime(timep);
390 if (local == NULL) {
391 /* unconvertible time */
392#ifdef EINVAL
393 if (errno == 0)
394 errno = EINVAL;
395#endif
396 PyErr_SetFromErrno(PyExc_OSError);
397 return -1;
398 }
399 *result = *local;
400 return 0;
401}
402
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000403static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000404time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000405{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100406 time_t when;
407 struct tm buf;
408
409 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 return NULL;
Alexander Belopolskyd9738242012-06-12 16:14:17 -0400411 if (pylocaltime(&when, &buf) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100412 return NULL;
413 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000414}
415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000416PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000417"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000419\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000420Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000421When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000422
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000423/* Convert 9-item tuple to tm structure. Return 1 on success, set
424 * an exception and return 0 on error.
425 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000426static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000427gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000432
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000433 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 PyErr_SetString(PyExc_TypeError,
435 "Tuple or struct_time argument required");
436 return 0;
437 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000438
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000439 if (!PyArg_ParseTuple(args, "iiiiiiiii",
440 &y, &p->tm_mon, &p->tm_mday,
441 &p->tm_hour, &p->tm_min, &p->tm_sec,
442 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 p->tm_year = y - 1900;
445 p->tm_mon--;
446 p->tm_wday = (p->tm_wday + 1) % 7;
447 p->tm_yday--;
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400448#ifdef HAVE_STRUCT_TM_TM_ZONE
449 if (Py_TYPE(args) == &StructTimeType) {
450 PyObject *item;
451 item = PyTuple_GET_ITEM(args, 9);
452 p->tm_zone = item == Py_None ? NULL : _PyUnicode_AsString(item);
453 item = PyTuple_GET_ITEM(args, 10);
454 p->tm_gmtoff = item == Py_None ? 0 : PyLong_AsLong(item);
455 if (PyErr_Occurred())
456 return 0;
457 }
458#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000460}
461
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000462/* Check values of the struct tm fields before it is passed to strftime() and
463 * asctime(). Return 1 if all values are valid, otherwise set an exception
464 * and returns 0.
465 */
Victor Stinneref128102010-10-07 01:00:52 +0000466static int
467checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000468{
Victor Stinneref128102010-10-07 01:00:52 +0000469 /* Checks added to make sure strftime() and asctime() does not crash Python by
470 indexing blindly into some array for a textual representation
471 by some bad index (fixes bug #897625 and #6608).
472
473 Also support values of zero from Python code for arguments in which
474 that is out of range by forcing that value to the lowest value that
475 is valid (fixed bug #1520914).
476
477 Valid ranges based on what is allowed in struct tm:
478
479 - tm_year: [0, max(int)] (1)
480 - tm_mon: [0, 11] (2)
481 - tm_mday: [1, 31]
482 - tm_hour: [0, 23]
483 - tm_min: [0, 59]
484 - tm_sec: [0, 60]
485 - tm_wday: [0, 6] (1)
486 - tm_yday: [0, 365] (2)
487 - tm_isdst: [-max(int), max(int)]
488
489 (1) gettmarg() handles bounds-checking.
490 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000491 thus need to check against automatic decrement by gettmarg().
492 */
493 if (buf->tm_mon == -1)
494 buf->tm_mon = 0;
495 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
496 PyErr_SetString(PyExc_ValueError, "month out of range");
497 return 0;
498 }
499 if (buf->tm_mday == 0)
500 buf->tm_mday = 1;
501 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
502 PyErr_SetString(PyExc_ValueError, "day of month out of range");
503 return 0;
504 }
505 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
506 PyErr_SetString(PyExc_ValueError, "hour out of range");
507 return 0;
508 }
509 if (buf->tm_min < 0 || buf->tm_min > 59) {
510 PyErr_SetString(PyExc_ValueError, "minute out of range");
511 return 0;
512 }
513 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
514 PyErr_SetString(PyExc_ValueError, "seconds out of range");
515 return 0;
516 }
517 /* tm_wday does not need checking of its upper-bound since taking
518 ``% 7`` in gettmarg() automatically restricts the range. */
519 if (buf->tm_wday < 0) {
520 PyErr_SetString(PyExc_ValueError, "day of week out of range");
521 return 0;
522 }
523 if (buf->tm_yday == -1)
524 buf->tm_yday = 0;
525 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
526 PyErr_SetString(PyExc_ValueError, "day of year out of range");
527 return 0;
528 }
529 return 1;
530}
531
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200532#ifdef MS_WINDOWS
533 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
534# undef HAVE_WCSFTIME
535#endif
Alexander Belopolskycf774542012-10-02 18:39:16 -0400536#define STRFTIME_FORMAT_CODES \
537"Commonly used format codes:\n\
538\n\
539%Y Year with century as a decimal number.\n\
540%m Month as a decimal number [01,12].\n\
541%d Day of the month as a decimal number [01,31].\n\
542%H Hour (24-hour clock) as a decimal number [00,23].\n\
543%M Minute as a decimal number [00,59].\n\
544%S Second as a decimal number [00,61].\n\
545%z Time zone offset from UTC.\n\
546%a Locale's abbreviated weekday name.\n\
547%A Locale's full weekday name.\n\
548%b Locale's abbreviated month name.\n\
549%B Locale's full month name.\n\
550%c Locale's appropriate date and time representation.\n\
551%I Hour (12-hour clock) as a decimal number [01,12].\n\
552%p Locale's equivalent of either AM or PM.\n\
553\n\
554Other codes may be available on your platform. See documentation for\n\
555the C library strftime function.\n"
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200556
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000557#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000558#ifdef HAVE_WCSFTIME
559#define time_char wchar_t
560#define format_time wcsftime
561#define time_strlen wcslen
562#else
563#define time_char char
564#define format_time strftime
565#define time_strlen strlen
566#endif
567
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000568static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000569time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 PyObject *tup = NULL;
572 struct tm buf;
573 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000574#ifdef HAVE_WCSFTIME
575 wchar_t *format;
576#else
577 PyObject *format;
578#endif
Victor Stinneref128102010-10-07 01:00:52 +0000579 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000581 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000583 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 /* Will always expect a unicode string to be passed as format.
588 Given that there's no str type anymore in py3k this seems safe.
589 */
Victor Stinneref128102010-10-07 01:00:52 +0000590 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (tup == NULL) {
594 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100595 if (pylocaltime(&tt, &buf) == -1)
596 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000597 }
598 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000600
Victor Stinner36b82d82013-06-25 02:33:53 +0200601#if defined(_MSC_VER) || defined(sun) || defined(_AIX)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000602 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100603 PyErr_SetString(PyExc_ValueError,
604 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000605 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000606 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000607#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 /* Normalize tm_isdst just in case someone foolishly implements %Z
610 based on the assumption that tm_isdst falls within the range of
611 [-1, 1] */
612 if (buf.tm_isdst < -1)
613 buf.tm_isdst = -1;
614 else if (buf.tm_isdst > 1)
615 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000616
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000617#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000618 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000619 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000621 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100624 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (format == NULL)
626 return NULL;
627 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000628#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000629
Stefan Krah4aea7d32012-02-27 16:30:26 +0100630#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200632 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200634 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 {
636 if (outbuf[1]=='#')
637 ++outbuf; /* not documented by python, */
638 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200639 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 {
641 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100642 Py_DECREF(format);
643 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 }
Tim Golden6e51b8f2013-11-12 12:36:54 +0000645 if ((outbuf[1] == 'y') && buf.tm_year < 0)
646 {
647 PyErr_SetString(PyExc_ValueError,
648 "format %y requires year >= 1900 on Windows");
649 Py_DECREF(format);
650 return NULL;
651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000653#endif
654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 /* I hate these functions that presume you know how big the output
658 * will be ahead of time...
659 */
660 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100661#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100662 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
665 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000666 PyErr_NoMemory();
667 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 }
669 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100670#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100671 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 if (buflen > 0 || i >= 256 * fmtlen) {
674 /* If the buffer is 256 times as long as the format,
675 it's probably not failing for lack of room!
676 More likely, the format yields an empty result,
677 e.g. an empty format, or %Z when the timezone
678 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000679#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000681#else
Victor Stinner1b579672011-12-17 05:47:23 +0100682 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
683 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000686 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 }
688 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100691 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000693 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000697#ifdef HAVE_WCSFTIME
698 PyMem_Free(format);
699#else
700 Py_DECREF(format);
701#endif
702 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000703}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000704
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000705#undef time_char
706#undef format_time
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000707PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000708"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000709\n\
710Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000711See the library reference manual for formatting codes. When the time tuple\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400712is not present, current time as returned by localtime() is used.\n\
713\n" STRFTIME_FORMAT_CODES);
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000714#endif /* HAVE_STRFTIME */
715
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000716static PyObject *
717time_strptime(PyObject *self, PyObject *args)
718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
720 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200721 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (!strptime_module)
724 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200725 strptime_result = _PyObject_CallMethodId(strptime_module,
726 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 Py_DECREF(strptime_module);
728 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000729}
730
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000732PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000733"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000734\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000735Parse a string to a time tuple according to a format specification.\n\
Alexander Belopolskycf774542012-10-02 18:39:16 -0400736See the library reference manual for formatting codes (same as\n\
737strftime()).\n\
738\n" STRFTIME_FORMAT_CODES);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000739
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000740static PyObject *
741_asctime(struct tm *timeptr)
742{
743 /* Inspired by Open Group reference implementation available at
744 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100745 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000746 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
747 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100748 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000749 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
750 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
751 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100752 return PyUnicode_FromFormat(
753 "%s %s%3d %.2d:%.2d:%.2d %d",
754 wday_name[timeptr->tm_wday],
755 mon_name[timeptr->tm_mon],
756 timeptr->tm_mday, timeptr->tm_hour,
757 timeptr->tm_min, timeptr->tm_sec,
758 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000759}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000760
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000761static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000762time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 PyObject *tup = NULL;
765 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
768 return NULL;
769 if (tup == NULL) {
770 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100771 if (pylocaltime(&tt, &buf) == -1)
772 return NULL;
773
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000774 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000776 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000777}
778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000779PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000780"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000781\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000782Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
783When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000784is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000785
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000786static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000787time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100790 struct tm buf;
791 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100793 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000794 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100795 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000796}
797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000798PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000799"ctime(seconds) -> string\n\
800\n\
801Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000802This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000803not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000804
Guido van Rossum60cd8131998-03-06 17:16:21 +0000805#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000806static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100807time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 struct tm buf;
810 time_t tt;
811 if (!gettmarg(tup, &buf))
812 return NULL;
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000813 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000815 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200816 * cannot remain set to -1 if mktime succeeded. */
Victor Stinner93037492013-06-25 22:54:35 +0200817 if (tt == (time_t)(-1)
818#ifndef _AIX
819 /* Return value of -1 does not necessarily mean an error, but
820 * tm_wday cannot remain set to -1 if mktime succeeded. */
821 && buf.tm_wday == -1
822#else
823 /* on AIX, tm_wday is always sets, even on error */
824#endif
825 )
826 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 PyErr_SetString(PyExc_OverflowError,
828 "mktime argument out of range");
829 return NULL;
830 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100831 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000832}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000834PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000835"mktime(tuple) -> floating point number\n\
836\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400837Convert a time tuple in local time to seconds since the Epoch.\n\
838Note that mktime(gmtime(0)) will not generally return zero for most\n\
839time zones; instead the returned value will either be equal to that\n\
840of the timezone or altzone attributes on the time module.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000841#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000842
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000843#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000844static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000846static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000847time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 m = PyImport_ImportModuleNoBlock("time");
852 if (m == NULL) {
853 return NULL;
854 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 /* Reset timezone, altzone, daylight and tzname */
859 PyInit_timezone(m);
860 Py_DECREF(m);
Victor Stinner2ff51b82013-07-17 21:42:45 +0200861 if (PyErr_Occurred())
862 return NULL;
Tim Peters1b6f7a92004-06-20 02:50:16 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 Py_INCREF(Py_None);
865 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000866}
867
868PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000869"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000870\n\
871Initialize, or reinitialize, the local timezone to the value stored in\n\
872os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000873standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000874(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
875fall back to UTC. If the TZ environment variable is not set, the local\n\
876timezone is set to the systems best guess of wallclock time.\n\
877Changing the TZ environment variable without calling tzset *may* change\n\
878the local timezone used by methods such as localtime, but this behaviour\n\
879should not be relied on.");
880#endif /* HAVE_WORKING_TZSET */
881
Victor Stinnerec895392012-04-29 02:41:27 +0200882#if defined(MS_WINDOWS) || defined(__APPLE__) \
883 || (defined(HAVE_CLOCK_GETTIME) \
884 && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC)))
885#define PYMONOTONIC
886#endif
887
888#ifdef PYMONOTONIC
Victor Stinner071eca32012-03-15 01:17:09 +0100889static PyObject*
Victor Stinnerec895392012-04-29 02:41:27 +0200890pymonotonic(_Py_clock_info_t *info)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100891{
Victor Stinnerec895392012-04-29 02:41:27 +0200892#if defined(MS_WINDOWS)
893 static ULONGLONG (*GetTickCount64) (void) = NULL;
894 static ULONGLONG (CALLBACK *Py_GetTickCount64)(void);
895 static int has_getickcount64 = -1;
896 double result;
897
898 if (has_getickcount64 == -1) {
899 /* GetTickCount64() was added to Windows Vista */
900 if (winver.dwMajorVersion >= 6) {
901 HINSTANCE hKernel32;
902 hKernel32 = GetModuleHandleW(L"KERNEL32");
903 *(FARPROC*)&Py_GetTickCount64 = GetProcAddress(hKernel32,
904 "GetTickCount64");
905 has_getickcount64 = (Py_GetTickCount64 != NULL);
906 }
907 else
908 has_getickcount64 = 0;
909 }
910
911 if (has_getickcount64) {
912 ULONGLONG ticks;
913 ticks = Py_GetTickCount64();
914 result = (double)ticks * 1e-3;
915 }
916 else {
917 static DWORD last_ticks = 0;
918 static DWORD n_overflow = 0;
919 DWORD ticks;
920
921 ticks = GetTickCount();
922 if (ticks < last_ticks)
923 n_overflow++;
924 last_ticks = ticks;
925
926 result = ldexp(n_overflow, 32);
927 result += ticks;
928 result *= 1e-3;
929 }
930
931 if (info) {
932 DWORD timeAdjustment, timeIncrement;
933 BOOL isTimeAdjustmentDisabled, ok;
934 if (has_getickcount64)
935 info->implementation = "GetTickCount64()";
936 else
937 info->implementation = "GetTickCount()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400938 info->monotonic = 1;
Victor Stinnerec895392012-04-29 02:41:27 +0200939 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
940 &isTimeAdjustmentDisabled);
941 if (!ok) {
942 PyErr_SetFromWindowsErr(0);
943 return NULL;
944 }
945 info->resolution = timeIncrement * 1e-7;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200946 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200947 }
948 return PyFloat_FromDouble(result);
949
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100950#elif defined(__APPLE__)
Victor Stinner74eb6c02012-03-28 02:50:46 +0200951 static mach_timebase_info_data_t timebase;
952 uint64_t time;
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100953 double secs;
954
Victor Stinner74eb6c02012-03-28 02:50:46 +0200955 if (timebase.denom == 0) {
956 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
957 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
958 (void)mach_timebase_info(&timebase);
959 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100960
Victor Stinner74eb6c02012-03-28 02:50:46 +0200961 time = mach_absolute_time();
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100962 secs = (double)time * timebase.numer / timebase.denom * 1e-9;
Victor Stinnerec895392012-04-29 02:41:27 +0200963 if (info) {
964 info->implementation = "mach_absolute_time()";
965 info->resolution = (double)timebase.numer / timebase.denom * 1e-9;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400966 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200967 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200968 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100969 return PyFloat_FromDouble(secs);
Victor Stinnerec895392012-04-29 02:41:27 +0200970
971#elif defined(HAVE_CLOCK_GETTIME) && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC))
Victor Stinner8b302012012-02-07 23:29:46 +0100972 struct timespec tp;
Victor Stinnerec895392012-04-29 02:41:27 +0200973#ifdef CLOCK_HIGHRES
974 const clockid_t clk_id = CLOCK_HIGHRES;
975 const char *function = "clock_gettime(CLOCK_HIGHRES)";
976#else
977 const clockid_t clk_id = CLOCK_MONOTONIC;
978 const char *function = "clock_gettime(CLOCK_MONOTONIC)";
979#endif
Victor Stinner8b302012012-02-07 23:29:46 +0100980
Victor Stinnerec895392012-04-29 02:41:27 +0200981 if (clock_gettime(clk_id, &tp) != 0) {
Victor Stinner071eca32012-03-15 01:17:09 +0100982 PyErr_SetFromErrno(PyExc_OSError);
983 return NULL;
984 }
Victor Stinnerec895392012-04-29 02:41:27 +0200985
986 if (info) {
987 struct timespec res;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400988 info->monotonic = 1;
Victor Stinnerec895392012-04-29 02:41:27 +0200989 info->implementation = function;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200990 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200991 if (clock_getres(clk_id, &res) == 0)
992 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
993 else
994 info->resolution = 1e-9;
Victor Stinner071eca32012-03-15 01:17:09 +0100995 }
Victor Stinnerec895392012-04-29 02:41:27 +0200996 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinner8b302012012-02-07 23:29:46 +0100997#endif
998}
999
Victor Stinner071eca32012-03-15 01:17:09 +01001000static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +02001001time_monotonic(PyObject *self, PyObject *unused)
Victor Stinner071eca32012-03-15 01:17:09 +01001002{
Victor Stinnerec895392012-04-29 02:41:27 +02001003 return pymonotonic(NULL);
Victor Stinner071eca32012-03-15 01:17:09 +01001004}
1005
Victor Stinnerec895392012-04-29 02:41:27 +02001006PyDoc_STRVAR(monotonic_doc,
1007"monotonic() -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +01001008\n\
Victor Stinnerec895392012-04-29 02:41:27 +02001009Monotonic clock, cannot go backward.");
1010#endif /* PYMONOTONIC */
Victor Stinnerec919cc2012-03-15 00:58:32 +01001011
Victor Stinnerec895392012-04-29 02:41:27 +02001012static PyObject*
1013perf_counter(_Py_clock_info_t *info)
1014{
1015#if defined(WIN32_PERF_COUNTER) || defined(PYMONOTONIC)
1016 PyObject *res;
1017#endif
1018#if defined(WIN32_PERF_COUNTER)
1019 static int use_perf_counter = 1;
1020#endif
1021#ifdef PYMONOTONIC
1022 static int use_monotonic = 1;
1023#endif
1024
1025#ifdef WIN32_PERF_COUNTER
1026 if (use_perf_counter) {
1027 if (win_perf_counter(info, &res) == 0)
1028 return res;
1029 use_perf_counter = 0;
1030 }
1031#endif
1032
1033#ifdef PYMONOTONIC
1034 if (use_monotonic) {
1035 res = pymonotonic(info);
1036 if (res != NULL)
1037 return res;
1038 use_monotonic = 0;
1039 PyErr_Clear();
1040 }
1041#endif
1042
1043 return floattime(info);
1044}
1045
1046static PyObject *
1047time_perf_counter(PyObject *self, PyObject *unused)
1048{
1049 return perf_counter(NULL);
1050}
1051
1052PyDoc_STRVAR(perf_counter_doc,
1053"perf_counter() -> float\n\
1054\n\
1055Performance counter for benchmarking.");
1056
1057static PyObject*
1058py_process_time(_Py_clock_info_t *info)
1059{
1060#if defined(MS_WINDOWS)
1061 HANDLE process;
1062 FILETIME creation_time, exit_time, kernel_time, user_time;
1063 ULARGE_INTEGER large;
1064 double total;
1065 BOOL ok;
1066
1067 process = GetCurrentProcess();
1068 ok = GetProcessTimes(process, &creation_time, &exit_time, &kernel_time, &user_time);
1069 if (!ok)
1070 return PyErr_SetFromWindowsErr(0);
1071
1072 large.u.LowPart = kernel_time.dwLowDateTime;
1073 large.u.HighPart = kernel_time.dwHighDateTime;
1074 total = (double)large.QuadPart;
1075 large.u.LowPart = user_time.dwLowDateTime;
1076 large.u.HighPart = user_time.dwHighDateTime;
1077 total += (double)large.QuadPart;
1078 if (info) {
1079 info->implementation = "GetProcessTimes()";
1080 info->resolution = 1e-7;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001081 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001082 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001083 }
1084 return PyFloat_FromDouble(total * 1e-7);
1085#else
1086
1087#if defined(HAVE_SYS_RESOURCE_H)
1088 struct rusage ru;
1089#endif
1090#ifdef HAVE_TIMES
1091 struct tms t;
1092 static long ticks_per_second = -1;
1093#endif
1094
1095#if defined(HAVE_CLOCK_GETTIME) \
1096 && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
1097 struct timespec tp;
1098#ifdef CLOCK_PROF
1099 const clockid_t clk_id = CLOCK_PROF;
1100 const char *function = "clock_gettime(CLOCK_PROF)";
1101#else
1102 const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID;
1103 const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)";
1104#endif
1105
1106 if (clock_gettime(clk_id, &tp) == 0) {
1107 if (info) {
1108 struct timespec res;
1109 info->implementation = function;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001110 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001111 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001112 if (clock_getres(clk_id, &res) == 0)
1113 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
1114 else
1115 info->resolution = 1e-9;
1116 }
1117 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
1118 }
1119#endif
1120
1121#if defined(HAVE_SYS_RESOURCE_H)
1122 if (getrusage(RUSAGE_SELF, &ru) == 0) {
1123 double total;
1124 total = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec * 1e-6;
1125 total += ru.ru_stime.tv_sec + ru.ru_stime.tv_usec * 1e-6;
1126 if (info) {
1127 info->implementation = "getrusage(RUSAGE_SELF)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001128 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001129 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001130 info->resolution = 1e-6;
1131 }
1132 return PyFloat_FromDouble(total);
1133 }
1134#endif
1135
1136#ifdef HAVE_TIMES
1137 if (times(&t) != (clock_t)-1) {
1138 double total;
1139
1140 if (ticks_per_second == -1) {
1141#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
1142 ticks_per_second = sysconf(_SC_CLK_TCK);
1143 if (ticks_per_second < 1)
1144 ticks_per_second = -1;
1145#elif defined(HZ)
1146 ticks_per_second = HZ;
1147#else
1148 ticks_per_second = 60; /* magic fallback value; may be bogus */
1149#endif
1150 }
1151
1152 if (ticks_per_second != -1) {
1153 total = (double)t.tms_utime / ticks_per_second;
1154 total += (double)t.tms_stime / ticks_per_second;
1155 if (info) {
1156 info->implementation = "times()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001157 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001158 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001159 info->resolution = 1.0 / ticks_per_second;
1160 }
1161 return PyFloat_FromDouble(total);
1162 }
1163 }
1164#endif
1165
1166 return floatclock(info);
1167#endif
1168}
1169
1170static PyObject *
1171time_process_time(PyObject *self, PyObject *unused)
1172{
1173 return py_process_time(NULL);
1174}
1175
1176PyDoc_STRVAR(process_time_doc,
1177"process_time() -> float\n\
1178\n\
1179Process time for profiling: sum of the kernel and user-space CPU time.");
1180
1181
Victor Stinnerec895392012-04-29 02:41:27 +02001182static PyObject *
1183time_get_clock_info(PyObject *self, PyObject *args)
1184{
1185 char *name;
Victor Stinnerec895392012-04-29 02:41:27 +02001186 _Py_clock_info_t info;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001187 PyObject *obj = NULL, *dict, *ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001188
1189 if (!PyArg_ParseTuple(args, "s:get_clock_info", &name))
1190 return NULL;
1191
1192#ifdef Py_DEBUG
1193 info.implementation = NULL;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001194 info.monotonic = -1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001195 info.adjustable = -1;
Victor Stinnerec895392012-04-29 02:41:27 +02001196 info.resolution = -1.0;
1197#else
1198 info.implementation = "";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001199 info.monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001200 info.adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001201 info.resolution = 1.0;
1202#endif
1203
1204 if (strcmp(name, "time") == 0)
1205 obj = floattime(&info);
1206#ifdef PYCLOCK
1207 else if (strcmp(name, "clock") == 0)
1208 obj = pyclock(&info);
1209#endif
1210#ifdef PYMONOTONIC
1211 else if (strcmp(name, "monotonic") == 0)
1212 obj = pymonotonic(&info);
1213#endif
1214 else if (strcmp(name, "perf_counter") == 0)
1215 obj = perf_counter(&info);
1216 else if (strcmp(name, "process_time") == 0)
1217 obj = py_process_time(&info);
1218 else {
1219 PyErr_SetString(PyExc_ValueError, "unknown clock");
1220 return NULL;
1221 }
1222 if (obj == NULL)
1223 return NULL;
1224 Py_DECREF(obj);
1225
Victor Stinnerbda4b882012-06-12 22:11:44 +02001226 dict = PyDict_New();
1227 if (dict == NULL)
Victor Stinnerec895392012-04-29 02:41:27 +02001228 return NULL;
1229
1230 assert(info.implementation != NULL);
1231 obj = PyUnicode_FromString(info.implementation);
1232 if (obj == NULL)
1233 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001234 if (PyDict_SetItemString(dict, "implementation", obj) == -1)
1235 goto error;
1236 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001237
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001238 assert(info.monotonic != -1);
1239 obj = PyBool_FromLong(info.monotonic);
Victor Stinnerec895392012-04-29 02:41:27 +02001240 if (obj == NULL)
1241 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001242 if (PyDict_SetItemString(dict, "monotonic", obj) == -1)
1243 goto error;
1244 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001245
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001246 assert(info.adjustable != -1);
1247 obj = PyBool_FromLong(info.adjustable);
Victor Stinnerec895392012-04-29 02:41:27 +02001248 if (obj == NULL)
1249 goto error;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001250 if (PyDict_SetItemString(dict, "adjustable", obj) == -1)
Victor Stinnerbda4b882012-06-12 22:11:44 +02001251 goto error;
1252 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001253
1254 assert(info.resolution > 0.0);
1255 assert(info.resolution <= 1.0);
1256 obj = PyFloat_FromDouble(info.resolution);
1257 if (obj == NULL)
1258 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001259 if (PyDict_SetItemString(dict, "resolution", obj) == -1)
1260 goto error;
1261 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001262
Victor Stinnerbda4b882012-06-12 22:11:44 +02001263 ns = _PyNamespace_New(dict);
1264 Py_DECREF(dict);
1265 return ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001266
1267error:
Victor Stinnerbda4b882012-06-12 22:11:44 +02001268 Py_DECREF(dict);
1269 Py_XDECREF(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001270 return NULL;
1271}
1272
1273PyDoc_STRVAR(get_clock_info_doc,
1274"get_clock_info(name: str) -> dict\n\
1275\n\
1276Get information of the specified clock.");
Victor Stinner8b302012012-02-07 23:29:46 +01001277
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001278static void
Martin v. Löwis1a214512008-06-11 05:26:20 +00001279PyInit_timezone(PyObject *m) {
1280 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 time_tzset. In the future, some parts of it can be moved back
1282 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
1283 are), and the extraneous calls to tzset(3) should be removed.
1284 I haven't done this yet, as I don't want to change this code as
1285 little as possible when introducing the time.tzset and time.tzsetwall
1286 methods. This should simply be a method of doing the following once,
1287 at the top of this function and removing the call to tzset() from
1288 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 #ifdef HAVE_TZSET
1291 tzset()
1292 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001295 */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001296#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 PyObject *otz0, *otz1;
1298 tzset();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001300#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001302#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +01001306 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
1307 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +00001309#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001310#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 {
Guido van Rossum234f9421993-06-17 12:35:49 +00001312#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 time_t t;
1314 struct tm *p;
1315 long janzone, julyzone;
1316 char janname[10], julyname[10];
1317 t = (time((time_t *)0) / YEAR) * YEAR;
1318 p = localtime(&t);
1319 janzone = -p->tm_gmtoff;
1320 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
1321 janname[9] = '\0';
1322 t += YEAR/2;
1323 p = localtime(&t);
1324 julyzone = -p->tm_gmtoff;
1325 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
1326 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +00001327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 if( janzone < julyzone ) {
1329 /* DST is reversed in the southern hemisphere */
1330 PyModule_AddIntConstant(m, "timezone", julyzone);
1331 PyModule_AddIntConstant(m, "altzone", janzone);
1332 PyModule_AddIntConstant(m, "daylight",
1333 janzone != julyzone);
1334 PyModule_AddObject(m, "tzname",
1335 Py_BuildValue("(zz)",
1336 julyname, janname));
1337 } else {
1338 PyModule_AddIntConstant(m, "timezone", janzone);
1339 PyModule_AddIntConstant(m, "altzone", julyzone);
1340 PyModule_AddIntConstant(m, "daylight",
1341 janzone != julyzone);
1342 PyModule_AddObject(m, "tzname",
1343 Py_BuildValue("(zz)",
1344 janname, julyname));
1345 }
1346 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +00001347#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001348#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +00001349#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 tzset();
1351 PyModule_AddIntConstant(m, "timezone", _timezone);
1352 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
1353 PyModule_AddIntConstant(m, "daylight", _daylight);
1354 PyModule_AddObject(m, "tzname",
1355 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +00001356#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001357#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +02001358
Victor Stinnerec895392012-04-29 02:41:27 +02001359#if defined(HAVE_CLOCK_GETTIME)
Victor Stinnere0be4232011-10-25 13:06:09 +02001360 PyModule_AddIntMacro(m, CLOCK_REALTIME);
Victor Stinnere0be4232011-10-25 13:06:09 +02001361#ifdef CLOCK_MONOTONIC
1362 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
1363#endif
1364#ifdef CLOCK_MONOTONIC_RAW
1365 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
1366#endif
Victor Stinner1470f352012-04-03 00:31:17 +02001367#ifdef CLOCK_HIGHRES
1368 PyModule_AddIntMacro(m, CLOCK_HIGHRES);
1369#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001370#ifdef CLOCK_PROCESS_CPUTIME_ID
1371 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
1372#endif
1373#ifdef CLOCK_THREAD_CPUTIME_ID
1374 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
1375#endif
1376#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001377}
1378
1379
1380static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +01001381 {"time", time_time, METH_NOARGS, time_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001382#ifdef PYCLOCK
Victor Stinner4195b5c2012-02-08 23:03:19 +01001383 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001384#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001385#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001386 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinner30d79472012-04-03 00:45:07 +02001387 {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
Victor Stinner4195b5c2012-02-08 23:03:19 +01001388 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
1391 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
1392 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
1393 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
1394 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001395#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001396 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001397#endif
1398#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001402#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001404#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001405#ifdef PYMONOTONIC
1406 {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
1407#endif
1408 {"process_time", time_process_time, METH_NOARGS, process_time_doc},
1409 {"perf_counter", time_perf_counter, METH_NOARGS, perf_counter_doc},
1410 {"get_clock_info", time_get_clock_info, METH_VARARGS, get_clock_info_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001412};
1413
1414
1415PyDoc_STRVAR(module_doc,
1416"This module provides various functions to manipulate time values.\n\
1417\n\
1418There are two standard representations of time. One is the number\n\
1419of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1420or a floating point number (to represent fractions of seconds).\n\
1421The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1422The actual value can be retrieved by calling gmtime(0).\n\
1423\n\
1424The other representation is a tuple of 9 integers giving local time.\n\
1425The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001426 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001427 month (1-12)\n\
1428 day (1-31)\n\
1429 hours (0-23)\n\
1430 minutes (0-59)\n\
1431 seconds (0-59)\n\
1432 weekday (0-6, Monday is 0)\n\
1433 Julian day (day in the year, 1-366)\n\
1434 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1435If the DST flag is 0, the time is given in the regular time zone;\n\
1436if it is 1, the time is given in the DST time zone;\n\
1437if it is -1, mktime() should guess based on the date and time.\n\
1438\n\
1439Variables:\n\
1440\n\
1441timezone -- difference in seconds between UTC and local standard time\n\
1442altzone -- difference in seconds between UTC and local DST time\n\
1443daylight -- whether local time should reflect DST\n\
1444tzname -- tuple of (standard time zone name, DST time zone name)\n\
1445\n\
1446Functions:\n\
1447\n\
1448time() -- return current time in seconds since the Epoch as a float\n\
1449clock() -- return CPU time since process start as a float\n\
1450sleep() -- delay for a number of seconds given as a float\n\
1451gmtime() -- convert seconds since Epoch to UTC tuple\n\
1452localtime() -- convert seconds since Epoch to local time tuple\n\
1453asctime() -- convert time tuple to string\n\
1454ctime() -- convert time in seconds to string\n\
1455mktime() -- convert local time tuple to seconds since Epoch\n\
1456strftime() -- convert time tuple to string according to format specification\n\
1457strptime() -- parse string to time tuple according to format specification\n\
1458tzset() -- change the local timezone");
1459
1460
Martin v. Löwis1a214512008-06-11 05:26:20 +00001461
1462static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 PyModuleDef_HEAD_INIT,
1464 "time",
1465 module_doc,
1466 -1,
1467 time_methods,
1468 NULL,
1469 NULL,
1470 NULL,
1471 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001472};
1473
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001474PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001475PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 m = PyModule_Create(&timemodule);
1479 if (m == NULL)
1480 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 /* Set, or reset, module variables like time.timezone */
1483 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (!initialized) {
Victor Stinner1c8f0592013-07-22 22:24:54 +02001486 if (PyStructSequence_InitType2(&StructTimeType,
1487 &struct_time_type_desc) < 0)
1488 return NULL;
Victor Stinnerec895392012-04-29 02:41:27 +02001489
Victor Stinnerec895392012-04-29 02:41:27 +02001490#ifdef MS_WINDOWS
1491 winver.dwOSVersionInfoSize = sizeof(winver);
1492 if (!GetVersionEx((OSVERSIONINFO*)&winver)) {
1493 Py_DECREF(m);
1494 PyErr_SetFromWindowsErr(0);
1495 return NULL;
1496 }
1497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 }
1499 Py_INCREF(&StructTimeType);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -04001500#ifdef HAVE_STRUCT_TM_TM_ZONE
1501 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11);
1502#else
1503 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 9);
1504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1506 initialized = 1;
1507 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001508}
1509
Victor Stinner071eca32012-03-15 01:17:09 +01001510static PyObject*
Victor Stinnerec895392012-04-29 02:41:27 +02001511floattime(_Py_clock_info_t *info)
Victor Stinner4195b5c2012-02-08 23:03:19 +01001512{
1513 _PyTime_timeval t;
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001514#ifdef HAVE_CLOCK_GETTIME
1515 struct timespec tp;
1516 int ret;
1517
1518 /* _PyTime_gettimeofday() does not use clock_gettime()
1519 because it would require to link Python to the rt (real-time)
1520 library, at least on Linux */
1521 ret = clock_gettime(CLOCK_REALTIME, &tp);
Victor Stinnerec895392012-04-29 02:41:27 +02001522 if (ret == 0) {
1523 if (info) {
1524 struct timespec res;
1525 info->implementation = "clock_gettime(CLOCK_REALTIME)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001526 info->monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001527 info->adjustable = 1;
Victor Stinnerec895392012-04-29 02:41:27 +02001528 if (clock_getres(CLOCK_REALTIME, &res) == 0)
1529 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
1530 else
1531 info->resolution = 1e-9;
1532 }
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001533 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnerec895392012-04-29 02:41:27 +02001534 }
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001535#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001536 _PyTime_gettimeofday_info(&t, info);
Victor Stinner70b2e1e2012-03-26 22:08:02 +02001537 return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
Victor Stinner4195b5c2012-02-08 23:03:19 +01001538}
1539
1540
Guido van Rossumb6775db1994-08-01 11:34:53 +00001541/* Implement floatsleep() for various platforms.
1542 When interrupted (or when another error occurs), return -1 and
1543 set an exception; else return 0. */
1544
1545static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001546floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001547{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001548/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001549#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 struct timeval t;
1551 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001552 int err;
1553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 frac = fmod(secs, 1.0);
1555 secs = floor(secs);
1556 t.tv_sec = (long)secs;
1557 t.tv_usec = (long)(frac*1000000.0);
1558 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001559 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1560 Py_END_ALLOW_THREADS
1561 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001562#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001563 if (errno == EINTR) {
1564 if (PyErr_CheckSignals())
1565 return -1;
1566 }
1567 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001568#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001569 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 PyErr_SetFromErrno(PyExc_IOError);
1571 return -1;
1572 }
1573 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001574#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 /* XXX Can't interrupt this sleep */
1576 Py_BEGIN_ALLOW_THREADS
1577 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1578 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001579#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 {
1581 double millisecs = secs * 1000.0;
1582 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 if (millisecs > (double)ULONG_MAX) {
1585 PyErr_SetString(PyExc_OverflowError,
1586 "sleep length is too large");
1587 return -1;
1588 }
1589 Py_BEGIN_ALLOW_THREADS
1590 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1591 * by Guido, only the main thread can be interrupted.
1592 */
1593 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001594 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 Sleep(ul_millis);
1596 else {
1597 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001598 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 ResetEvent(hInterruptEvent);
Martin v. Löwisb26a9b12013-01-25 14:25:48 +01001600 rc = WaitForSingleObjectEx(hInterruptEvent, ul_millis, FALSE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 Py_BLOCK_THREADS
1603 errno = EINTR;
1604 PyErr_SetFromErrno(PyExc_IOError);
1605 return -1;
1606 }
1607 }
1608 Py_END_ALLOW_THREADS
1609 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001610#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 /* XXX Can't interrupt this sleep */
1612 Py_BEGIN_ALLOW_THREADS
1613 sleep((int)secs);
1614 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001615#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001618}