blob: 42ec3662e88292638a31f4907531bb6206d71caa [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
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000040#if defined(PYOS_OS2)
41#define INCL_DOS
42#define INCL_ERRORS
43#include <os2.h>
44#endif
45
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000046#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000047#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000048#endif
49
Victor Stinnera8ec5ea2012-03-13 00:25:42 +010050#if defined(__APPLE__)
51#include <mach/mach_time.h>
52#endif
53
Guido van Rossum234f9421993-06-17 12:35:49 +000054/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000055static int floatsleep(double);
Victor Stinnerec895392012-04-29 02:41:27 +020056static PyObject* floattime(_Py_clock_info_t *info);
57
58#ifdef MS_WINDOWS
59static OSVERSIONINFOEX winver;
60#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000062static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +010063time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064{
Victor Stinnerec895392012-04-29 02:41:27 +020065 return floattime(NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +000066}
67
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000068PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010069"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000070\n\
71Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000072Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000073
Victor Stinner85fdfa82012-01-27 00:38:48 +010074#if defined(HAVE_CLOCK)
75
76#ifndef CLOCKS_PER_SEC
77#ifdef CLK_TCK
78#define CLOCKS_PER_SEC CLK_TCK
79#else
80#define CLOCKS_PER_SEC 1000000
81#endif
82#endif
83
Victor Stinner4195b5c2012-02-08 23:03:19 +010084static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +020085floatclock(_Py_clock_info_t *info)
Victor Stinner85fdfa82012-01-27 00:38:48 +010086{
Victor Stinner4195b5c2012-02-08 23:03:19 +010087 clock_t value;
88 value = clock();
89 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010090 PyErr_SetString(PyExc_RuntimeError,
91 "the processor time used is not available "
92 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010093 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010094 }
Victor Stinnerec895392012-04-29 02:41:27 +020095 if (info) {
96 info->implementation = "clock()";
97 info->resolution = 1.0 / (double)CLOCKS_PER_SEC;
Benjamin Peterson49a69e42012-05-01 09:38:34 -040098 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +020099 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200100 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100101 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +0100102}
103#endif /* HAVE_CLOCK */
104
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinnerec895392012-04-29 02:41:27 +0200106#define WIN32_PERF_COUNTER
Victor Stinner9122fdd2011-07-04 13:55:40 +0200107/* Win32 has better clock replacement; we have our own version, due to Mark
108 Hammond and Tim Peters */
Victor Stinnerec895392012-04-29 02:41:27 +0200109static int
110win_perf_counter(_Py_clock_info_t *info, PyObject **result)
Guido van Rossum3917c221997-04-02 05:35:28 +0000111{
Victor Stinner8b302012012-02-07 23:29:46 +0100112 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100113 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +0100115 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +0000116
Victor Stinner8b302012012-02-07 23:29:46 +0100117 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100119 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100120 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
122 /* Unlikely to happen - this works on all intel
123 machines at least! Revert to clock() */
Victor Stinnerec895392012-04-29 02:41:27 +0200124 *result = NULL;
125 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 }
Victor Stinner8b302012012-02-07 23:29:46 +0100127 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
129 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100130 diff = (double)(now.QuadPart - ctrStart);
Victor Stinnerec895392012-04-29 02:41:27 +0200131 if (info) {
132 info->implementation = "QueryPerformanceCounter()";
133 info->resolution = 1.0 / (double)cpu_frequency;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400134 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200135 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200136 }
137 *result = PyFloat_FromDouble(diff / (double)cpu_frequency);
138 return 0;
Guido van Rossum3917c221997-04-02 05:35:28 +0000139}
Victor Stinner8b302012012-02-07 23:29:46 +0100140#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000141
Victor Stinnerec895392012-04-29 02:41:27 +0200142#if defined(WIN32_PERF_COUNTER) || defined(HAVE_CLOCK)
143#define PYCLOCK
144static PyObject*
145pyclock(_Py_clock_info_t *info)
146{
147#ifdef WIN32_PERF_COUNTER
148 PyObject *res;
149 if (win_perf_counter(info, &res) == 0)
150 return res;
151#endif
152 return floatclock(info);
153}
154
Victor Stinner9122fdd2011-07-04 13:55:40 +0200155static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100156time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200157{
Victor Stinnerec895392012-04-29 02:41:27 +0200158 return pyclock(NULL);
Victor Stinner9122fdd2011-07-04 13:55:40 +0200159}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000161PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100162"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000163\n\
164Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000165the first call to clock(). This has as much precision as the system\n\
166records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000167#endif
168
Victor Stinnere0be4232011-10-25 13:06:09 +0200169#ifdef HAVE_CLOCK_GETTIME
170static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100171time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200172{
173 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200174 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200175 struct timespec tp;
176
Victor Stinner4195b5c2012-02-08 23:03:19 +0100177 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200178 return NULL;
179
180 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100181 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200182 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100183 return NULL;
184 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100185 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200186}
187
188PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100189"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200190\n\
191Return the time of the specified clock clk_id.");
Victor Stinner30d79472012-04-03 00:45:07 +0200192
193static PyObject *
194time_clock_settime(PyObject *self, PyObject *args)
195{
Victor Stinnerb8d01692012-04-13 23:44:05 +0200196 int clk_id;
Victor Stinner30d79472012-04-03 00:45:07 +0200197 PyObject *obj;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200198 time_t tv_sec;
199 long tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200200 struct timespec tp;
201 int ret;
202
203 if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
204 return NULL;
205
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200206 if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec) == -1)
Victor Stinner30d79472012-04-03 00:45:07 +0200207 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200208 tp.tv_sec = tv_sec;
209 tp.tv_nsec = tv_nsec;
Victor Stinner30d79472012-04-03 00:45:07 +0200210
211 ret = clock_settime((clockid_t)clk_id, &tp);
212 if (ret != 0) {
213 PyErr_SetFromErrno(PyExc_IOError);
214 return NULL;
215 }
216 Py_RETURN_NONE;
217}
218
219PyDoc_STRVAR(clock_settime_doc,
220"clock_settime(clk_id, time)\n\
221\n\
222Set the time of the specified clock clk_id.");
Victor Stinnere0be4232011-10-25 13:06:09 +0200223
Victor Stinnere0be4232011-10-25 13:06:09 +0200224static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100225time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200226{
227 int ret;
Victor Stinnerb8d01692012-04-13 23:44:05 +0200228 int clk_id;
Victor Stinnere0be4232011-10-25 13:06:09 +0200229 struct timespec tp;
230
Victor Stinner4195b5c2012-02-08 23:03:19 +0100231 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200232 return NULL;
233
234 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100235 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200236 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100237 return NULL;
238 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100239
240 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200241}
242
243PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100244"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200245\n\
246Return the resolution (precision) of the specified clock clk_id.");
Victor Stinnerb8d01692012-04-13 23:44:05 +0200247#endif /* HAVE_CLOCK_GETTIME */
Victor Stinnere0be4232011-10-25 13:06:09 +0200248
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000249static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000250time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 double secs;
253 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
254 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200255 if (secs < 0) {
256 PyErr_SetString(PyExc_ValueError,
257 "sleep length must be non-negative");
258 return NULL;
259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 if (floatsleep(secs) != 0)
261 return NULL;
262 Py_INCREF(Py_None);
263 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264}
265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000266PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000267"sleep(seconds)\n\
268\n\
269Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000270a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000271
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000272static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000273 {"tm_year", "year, for example, 1993"},
274 {"tm_mon", "month of year, range [1, 12]"},
275 {"tm_mday", "day of month, range [1, 31]"},
276 {"tm_hour", "hours, range [0, 23]"},
277 {"tm_min", "minutes, range [0, 59]"},
278 {"tm_sec", "seconds, range [0, 61])"},
279 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
280 {"tm_yday", "day of year, range [1, 366]"},
281 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400282#ifdef HAVE_STRUCT_TM_TM_ZONE
283 {"tm_zone", "abbreviation of timezone name"},
284 {"tm_gmtoff", "offset from UTC in seconds"},
285#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000287};
288
289static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000291 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
292 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
293 " sequence of 9 integers.\n\n"
294 " Note that several fields' values are not the same as those defined by\n"
295 " the C language standard for struct tm. For example, the value of the\n"
296 " field tm_year is the actual year, not year - 1900. See individual\n"
297 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 struct_time_type_fields,
299 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000300};
Tim Peters9ad4b682002-02-13 05:14:18 +0000301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000302static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000303static PyTypeObject StructTimeType;
304
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400305
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000306static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000307tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 PyObject *v = PyStructSequence_New(&StructTimeType);
310 if (v == NULL)
311 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000312
Christian Heimes217cfd12007-12-02 14:31:20 +0000313#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 SET(0, p->tm_year + 1900);
316 SET(1, p->tm_mon + 1); /* Want January == 1 */
317 SET(2, p->tm_mday);
318 SET(3, p->tm_hour);
319 SET(4, p->tm_min);
320 SET(5, p->tm_sec);
321 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
322 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
323 SET(8, p->tm_isdst);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400324#ifdef HAVE_STRUCT_TM_TM_ZONE
325 PyStructSequence_SET_ITEM(v, 9,
326 PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
327 SET(10, p->tm_gmtoff);
328#endif /* HAVE_STRUCT_TM_TM_ZONE */
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000329#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 if (PyErr_Occurred()) {
331 Py_XDECREF(v);
332 return NULL;
333 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000336}
337
Fred Drakef901abd2004-08-03 17:58:55 +0000338/* Parse arg tuple that can contain an optional float-or-None value;
339 format needs to be "|O:name".
340 Returns non-zero on success (parallels PyArg_ParseTuple).
341*/
342static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100343parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100346 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 if (!PyArg_ParseTuple(args, format, &ot))
349 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100350 if (ot == NULL || ot == Py_None) {
351 whent = time(NULL);
352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100354 if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100355 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100357 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000359}
360
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000361static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000362time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000363{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100364 time_t when;
365 struct tm buf, *local;
366
367 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100369
370 errno = 0;
371 local = gmtime(&when);
372 if (local == NULL) {
373#ifdef EINVAL
374 if (errno == 0)
375 errno = EINVAL;
376#endif
377 return PyErr_SetFromErrno(PyExc_OSError);
378 }
379 buf = *local;
380 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000381}
382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000383PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000384"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000385 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000386\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000387Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400388GMT). When 'seconds' is not passed in, convert the current time instead.\n\
389\n\
390If the platform supports the tm_gmtoff and tm_zone, they are available as\n\
391attributes only.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000392
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100393static int
394pylocaltime(time_t *timep, struct tm *result)
395{
396 struct tm *local;
397
398 assert (timep != NULL);
399 local = localtime(timep);
400 if (local == NULL) {
401 /* unconvertible time */
402#ifdef EINVAL
403 if (errno == 0)
404 errno = EINVAL;
405#endif
406 PyErr_SetFromErrno(PyExc_OSError);
407 return -1;
408 }
409 *result = *local;
410 return 0;
411}
412
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000413static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000414time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000415{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100416 time_t when;
417 struct tm buf;
418
419 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 return NULL;
Alexander Belopolskyd9738242012-06-12 16:14:17 -0400421 if (pylocaltime(&when, &buf) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100422 return NULL;
423 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000424}
425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000426PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000427"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000429\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000430Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000431When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000432
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000433/* Convert 9-item tuple to tm structure. Return 1 on success, set
434 * an exception and return 0 on error.
435 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000436static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000437gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000442
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000443 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 PyErr_SetString(PyExc_TypeError,
445 "Tuple or struct_time argument required");
446 return 0;
447 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000448
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000449 if (!PyArg_ParseTuple(args, "iiiiiiiii",
450 &y, &p->tm_mon, &p->tm_mday,
451 &p->tm_hour, &p->tm_min, &p->tm_sec,
452 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 p->tm_year = y - 1900;
455 p->tm_mon--;
456 p->tm_wday = (p->tm_wday + 1) % 7;
457 p->tm_yday--;
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400458#ifdef HAVE_STRUCT_TM_TM_ZONE
459 if (Py_TYPE(args) == &StructTimeType) {
460 PyObject *item;
461 item = PyTuple_GET_ITEM(args, 9);
462 p->tm_zone = item == Py_None ? NULL : _PyUnicode_AsString(item);
463 item = PyTuple_GET_ITEM(args, 10);
464 p->tm_gmtoff = item == Py_None ? 0 : PyLong_AsLong(item);
465 if (PyErr_Occurred())
466 return 0;
467 }
468#endif /* HAVE_STRUCT_TM_TM_ZONE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000470}
471
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000472/* Check values of the struct tm fields before it is passed to strftime() and
473 * asctime(). Return 1 if all values are valid, otherwise set an exception
474 * and returns 0.
475 */
Victor Stinneref128102010-10-07 01:00:52 +0000476static int
477checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000478{
Victor Stinneref128102010-10-07 01:00:52 +0000479 /* Checks added to make sure strftime() and asctime() does not crash Python by
480 indexing blindly into some array for a textual representation
481 by some bad index (fixes bug #897625 and #6608).
482
483 Also support values of zero from Python code for arguments in which
484 that is out of range by forcing that value to the lowest value that
485 is valid (fixed bug #1520914).
486
487 Valid ranges based on what is allowed in struct tm:
488
489 - tm_year: [0, max(int)] (1)
490 - tm_mon: [0, 11] (2)
491 - tm_mday: [1, 31]
492 - tm_hour: [0, 23]
493 - tm_min: [0, 59]
494 - tm_sec: [0, 60]
495 - tm_wday: [0, 6] (1)
496 - tm_yday: [0, 365] (2)
497 - tm_isdst: [-max(int), max(int)]
498
499 (1) gettmarg() handles bounds-checking.
500 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000501 thus need to check against automatic decrement by gettmarg().
502 */
503 if (buf->tm_mon == -1)
504 buf->tm_mon = 0;
505 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
506 PyErr_SetString(PyExc_ValueError, "month out of range");
507 return 0;
508 }
509 if (buf->tm_mday == 0)
510 buf->tm_mday = 1;
511 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
512 PyErr_SetString(PyExc_ValueError, "day of month out of range");
513 return 0;
514 }
515 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
516 PyErr_SetString(PyExc_ValueError, "hour out of range");
517 return 0;
518 }
519 if (buf->tm_min < 0 || buf->tm_min > 59) {
520 PyErr_SetString(PyExc_ValueError, "minute out of range");
521 return 0;
522 }
523 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
524 PyErr_SetString(PyExc_ValueError, "seconds out of range");
525 return 0;
526 }
527 /* tm_wday does not need checking of its upper-bound since taking
528 ``% 7`` in gettmarg() automatically restricts the range. */
529 if (buf->tm_wday < 0) {
530 PyErr_SetString(PyExc_ValueError, "day of week out of range");
531 return 0;
532 }
533 if (buf->tm_yday == -1)
534 buf->tm_yday = 0;
535 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
536 PyErr_SetString(PyExc_ValueError, "day of year out of range");
537 return 0;
538 }
539 return 1;
540}
541
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200542#ifdef MS_WINDOWS
543 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
544# undef HAVE_WCSFTIME
545#endif
546
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000547#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000548#ifdef HAVE_WCSFTIME
549#define time_char wchar_t
550#define format_time wcsftime
551#define time_strlen wcslen
552#else
553#define time_char char
554#define format_time strftime
555#define time_strlen strlen
556#endif
557
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000558static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000559time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 PyObject *tup = NULL;
562 struct tm buf;
563 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000564#ifdef HAVE_WCSFTIME
565 wchar_t *format;
566#else
567 PyObject *format;
568#endif
Victor Stinneref128102010-10-07 01:00:52 +0000569 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000571 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000573 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 /* Will always expect a unicode string to be passed as format.
578 Given that there's no str type anymore in py3k this seems safe.
579 */
Victor Stinneref128102010-10-07 01:00:52 +0000580 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 if (tup == NULL) {
584 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100585 if (pylocaltime(&tt, &buf) == -1)
586 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000587 }
588 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000590
Victor Stinner36b82d82013-06-25 02:33:53 +0200591#if defined(_MSC_VER) || defined(sun) || defined(_AIX)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000592 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100593 PyErr_SetString(PyExc_ValueError,
594 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000595 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000596 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000597#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Normalize tm_isdst just in case someone foolishly implements %Z
600 based on the assumption that tm_isdst falls within the range of
601 [-1, 1] */
602 if (buf.tm_isdst < -1)
603 buf.tm_isdst = -1;
604 else if (buf.tm_isdst > 1)
605 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000606
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000607#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000608 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000609 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000611 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000612#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100614 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 if (format == NULL)
616 return NULL;
617 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000618#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000619
Stefan Krah4aea7d32012-02-27 16:30:26 +0100620#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200622 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200624 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 {
626 if (outbuf[1]=='#')
627 ++outbuf; /* not documented by python, */
628 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200629 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 {
631 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100632 Py_DECREF(format);
633 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 }
Tim Golden6e51b8f2013-11-12 12:36:54 +0000635 if ((outbuf[1] == 'y') && buf.tm_year < 0)
636 {
637 PyErr_SetString(PyExc_ValueError,
638 "format %y requires year >= 1900 on Windows");
639 Py_DECREF(format);
640 return NULL;
641 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000643#endif
644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* I hate these functions that presume you know how big the output
648 * will be ahead of time...
649 */
650 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100651#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100652 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
655 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000656 PyErr_NoMemory();
657 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 }
659 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100660#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100661 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 if (buflen > 0 || i >= 256 * fmtlen) {
664 /* If the buffer is 256 times as long as the format,
665 it's probably not failing for lack of room!
666 More likely, the format yields an empty result,
667 e.g. an empty format, or %Z when the timezone
668 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000669#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000671#else
Victor Stinner1b579672011-12-17 05:47:23 +0100672 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
673 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000676 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 }
678 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100681 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000683 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000687#ifdef HAVE_WCSFTIME
688 PyMem_Free(format);
689#else
690 Py_DECREF(format);
691#endif
692 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000693}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000694
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000695#undef time_char
696#undef format_time
697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000698PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000699"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000700\n\
701Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000702See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000703is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000704#endif /* HAVE_STRFTIME */
705
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000706static PyObject *
707time_strptime(PyObject *self, PyObject *args)
708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
710 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200711 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (!strptime_module)
714 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200715 strptime_result = _PyObject_CallMethodId(strptime_module,
716 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 Py_DECREF(strptime_module);
718 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000719}
720
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000722PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000723"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000724\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000725Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000726See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000727
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000728static PyObject *
729_asctime(struct tm *timeptr)
730{
731 /* Inspired by Open Group reference implementation available at
732 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100733 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000734 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
735 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100736 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000737 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
738 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
739 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100740 return PyUnicode_FromFormat(
741 "%s %s%3d %.2d:%.2d:%.2d %d",
742 wday_name[timeptr->tm_wday],
743 mon_name[timeptr->tm_mon],
744 timeptr->tm_mday, timeptr->tm_hour,
745 timeptr->tm_min, timeptr->tm_sec,
746 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000747}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000748
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000749static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000750time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 PyObject *tup = NULL;
753 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
756 return NULL;
757 if (tup == NULL) {
758 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100759 if (pylocaltime(&tt, &buf) == -1)
760 return NULL;
761
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000762 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000764 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000765}
766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000767PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000768"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000769\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000770Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
771When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000772is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000773
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000774static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000775time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100778 struct tm buf;
779 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100781 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000782 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100783 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000784}
785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000786PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000787"ctime(seconds) -> string\n\
788\n\
789Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000790This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000791not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000792
Guido van Rossum60cd8131998-03-06 17:16:21 +0000793#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000794static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100795time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 struct tm buf;
798 time_t tt;
799 if (!gettmarg(tup, &buf))
800 return NULL;
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000801 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000803 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200804 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000805 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 PyErr_SetString(PyExc_OverflowError,
807 "mktime argument out of range");
808 return NULL;
809 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100810 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000811}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000812
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000813PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000814"mktime(tuple) -> floating point number\n\
815\n\
Alexander Belopolskyc142bba2012-06-13 22:15:26 -0400816Convert a time tuple in local time to seconds since the Epoch.\n\
817Note that mktime(gmtime(0)) will not generally return zero for most\n\
818time zones; instead the returned value will either be equal to that\n\
819of the timezone or altzone attributes on the time module.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000820#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000821
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000822#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000823static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000824
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000825static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000826time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 m = PyImport_ImportModuleNoBlock("time");
831 if (m == NULL) {
832 return NULL;
833 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 /* Reset timezone, altzone, daylight and tzname */
838 PyInit_timezone(m);
839 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 Py_INCREF(Py_None);
842 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000843}
844
845PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000846"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000847\n\
848Initialize, or reinitialize, the local timezone to the value stored in\n\
849os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000850standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000851(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
852fall back to UTC. If the TZ environment variable is not set, the local\n\
853timezone is set to the systems best guess of wallclock time.\n\
854Changing the TZ environment variable without calling tzset *may* change\n\
855the local timezone used by methods such as localtime, but this behaviour\n\
856should not be relied on.");
857#endif /* HAVE_WORKING_TZSET */
858
Victor Stinnerec895392012-04-29 02:41:27 +0200859#if defined(MS_WINDOWS) || defined(__APPLE__) \
860 || (defined(HAVE_CLOCK_GETTIME) \
861 && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC)))
862#define PYMONOTONIC
863#endif
864
865#ifdef PYMONOTONIC
Victor Stinner071eca32012-03-15 01:17:09 +0100866static PyObject*
Victor Stinnerec895392012-04-29 02:41:27 +0200867pymonotonic(_Py_clock_info_t *info)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100868{
Victor Stinnerec895392012-04-29 02:41:27 +0200869#if defined(MS_WINDOWS)
870 static ULONGLONG (*GetTickCount64) (void) = NULL;
871 static ULONGLONG (CALLBACK *Py_GetTickCount64)(void);
872 static int has_getickcount64 = -1;
873 double result;
874
875 if (has_getickcount64 == -1) {
876 /* GetTickCount64() was added to Windows Vista */
877 if (winver.dwMajorVersion >= 6) {
878 HINSTANCE hKernel32;
879 hKernel32 = GetModuleHandleW(L"KERNEL32");
880 *(FARPROC*)&Py_GetTickCount64 = GetProcAddress(hKernel32,
881 "GetTickCount64");
882 has_getickcount64 = (Py_GetTickCount64 != NULL);
883 }
884 else
885 has_getickcount64 = 0;
886 }
887
888 if (has_getickcount64) {
889 ULONGLONG ticks;
890 ticks = Py_GetTickCount64();
891 result = (double)ticks * 1e-3;
892 }
893 else {
894 static DWORD last_ticks = 0;
895 static DWORD n_overflow = 0;
896 DWORD ticks;
897
898 ticks = GetTickCount();
899 if (ticks < last_ticks)
900 n_overflow++;
901 last_ticks = ticks;
902
903 result = ldexp(n_overflow, 32);
904 result += ticks;
905 result *= 1e-3;
906 }
907
908 if (info) {
909 DWORD timeAdjustment, timeIncrement;
910 BOOL isTimeAdjustmentDisabled, ok;
911 if (has_getickcount64)
912 info->implementation = "GetTickCount64()";
913 else
914 info->implementation = "GetTickCount()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400915 info->monotonic = 1;
Victor Stinnerec895392012-04-29 02:41:27 +0200916 ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
917 &isTimeAdjustmentDisabled);
918 if (!ok) {
919 PyErr_SetFromWindowsErr(0);
920 return NULL;
921 }
922 info->resolution = timeIncrement * 1e-7;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200923 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200924 }
925 return PyFloat_FromDouble(result);
926
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100927#elif defined(__APPLE__)
Victor Stinner74eb6c02012-03-28 02:50:46 +0200928 static mach_timebase_info_data_t timebase;
929 uint64_t time;
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100930 double secs;
931
Victor Stinner74eb6c02012-03-28 02:50:46 +0200932 if (timebase.denom == 0) {
933 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
934 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
935 (void)mach_timebase_info(&timebase);
936 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100937
Victor Stinner74eb6c02012-03-28 02:50:46 +0200938 time = mach_absolute_time();
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100939 secs = (double)time * timebase.numer / timebase.denom * 1e-9;
Victor Stinnerec895392012-04-29 02:41:27 +0200940 if (info) {
941 info->implementation = "mach_absolute_time()";
942 info->resolution = (double)timebase.numer / timebase.denom * 1e-9;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400943 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200944 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200945 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100946 return PyFloat_FromDouble(secs);
Victor Stinnerec895392012-04-29 02:41:27 +0200947
948#elif defined(HAVE_CLOCK_GETTIME) && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC))
Victor Stinner8b302012012-02-07 23:29:46 +0100949 struct timespec tp;
Victor Stinnerec895392012-04-29 02:41:27 +0200950#ifdef CLOCK_HIGHRES
951 const clockid_t clk_id = CLOCK_HIGHRES;
952 const char *function = "clock_gettime(CLOCK_HIGHRES)";
953#else
954 const clockid_t clk_id = CLOCK_MONOTONIC;
955 const char *function = "clock_gettime(CLOCK_MONOTONIC)";
956#endif
Victor Stinner8b302012012-02-07 23:29:46 +0100957
Victor Stinnerec895392012-04-29 02:41:27 +0200958 if (clock_gettime(clk_id, &tp) != 0) {
Victor Stinner071eca32012-03-15 01:17:09 +0100959 PyErr_SetFromErrno(PyExc_OSError);
960 return NULL;
961 }
Victor Stinnerec895392012-04-29 02:41:27 +0200962
963 if (info) {
964 struct timespec res;
Benjamin Peterson49a69e42012-05-01 09:38:34 -0400965 info->monotonic = 1;
Victor Stinnerec895392012-04-29 02:41:27 +0200966 info->implementation = function;
Victor Stinner2b89fdf2012-06-12 22:46:37 +0200967 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +0200968 if (clock_getres(clk_id, &res) == 0)
969 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
970 else
971 info->resolution = 1e-9;
Victor Stinner071eca32012-03-15 01:17:09 +0100972 }
Victor Stinnerec895392012-04-29 02:41:27 +0200973 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinner8b302012012-02-07 23:29:46 +0100974#endif
975}
976
Victor Stinner071eca32012-03-15 01:17:09 +0100977static PyObject *
Victor Stinnerec895392012-04-29 02:41:27 +0200978time_monotonic(PyObject *self, PyObject *unused)
Victor Stinner071eca32012-03-15 01:17:09 +0100979{
Victor Stinnerec895392012-04-29 02:41:27 +0200980 return pymonotonic(NULL);
Victor Stinner071eca32012-03-15 01:17:09 +0100981}
982
Victor Stinnerec895392012-04-29 02:41:27 +0200983PyDoc_STRVAR(monotonic_doc,
984"monotonic() -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +0100985\n\
Victor Stinnerec895392012-04-29 02:41:27 +0200986Monotonic clock, cannot go backward.");
987#endif /* PYMONOTONIC */
Victor Stinnerec919cc2012-03-15 00:58:32 +0100988
Victor Stinnerec895392012-04-29 02:41:27 +0200989static PyObject*
990perf_counter(_Py_clock_info_t *info)
991{
992#if defined(WIN32_PERF_COUNTER) || defined(PYMONOTONIC)
993 PyObject *res;
994#endif
995#if defined(WIN32_PERF_COUNTER)
996 static int use_perf_counter = 1;
997#endif
998#ifdef PYMONOTONIC
999 static int use_monotonic = 1;
1000#endif
1001
1002#ifdef WIN32_PERF_COUNTER
1003 if (use_perf_counter) {
1004 if (win_perf_counter(info, &res) == 0)
1005 return res;
1006 use_perf_counter = 0;
1007 }
1008#endif
1009
1010#ifdef PYMONOTONIC
1011 if (use_monotonic) {
1012 res = pymonotonic(info);
1013 if (res != NULL)
1014 return res;
1015 use_monotonic = 0;
1016 PyErr_Clear();
1017 }
1018#endif
1019
1020 return floattime(info);
1021}
1022
1023static PyObject *
1024time_perf_counter(PyObject *self, PyObject *unused)
1025{
1026 return perf_counter(NULL);
1027}
1028
1029PyDoc_STRVAR(perf_counter_doc,
1030"perf_counter() -> float\n\
1031\n\
1032Performance counter for benchmarking.");
1033
1034static PyObject*
1035py_process_time(_Py_clock_info_t *info)
1036{
1037#if defined(MS_WINDOWS)
1038 HANDLE process;
1039 FILETIME creation_time, exit_time, kernel_time, user_time;
1040 ULARGE_INTEGER large;
1041 double total;
1042 BOOL ok;
1043
1044 process = GetCurrentProcess();
1045 ok = GetProcessTimes(process, &creation_time, &exit_time, &kernel_time, &user_time);
1046 if (!ok)
1047 return PyErr_SetFromWindowsErr(0);
1048
1049 large.u.LowPart = kernel_time.dwLowDateTime;
1050 large.u.HighPart = kernel_time.dwHighDateTime;
1051 total = (double)large.QuadPart;
1052 large.u.LowPart = user_time.dwLowDateTime;
1053 large.u.HighPart = user_time.dwHighDateTime;
1054 total += (double)large.QuadPart;
1055 if (info) {
1056 info->implementation = "GetProcessTimes()";
1057 info->resolution = 1e-7;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001058 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001059 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001060 }
1061 return PyFloat_FromDouble(total * 1e-7);
1062#else
1063
1064#if defined(HAVE_SYS_RESOURCE_H)
1065 struct rusage ru;
1066#endif
1067#ifdef HAVE_TIMES
1068 struct tms t;
1069 static long ticks_per_second = -1;
1070#endif
1071
1072#if defined(HAVE_CLOCK_GETTIME) \
1073 && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
1074 struct timespec tp;
1075#ifdef CLOCK_PROF
1076 const clockid_t clk_id = CLOCK_PROF;
1077 const char *function = "clock_gettime(CLOCK_PROF)";
1078#else
1079 const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID;
1080 const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)";
1081#endif
1082
1083 if (clock_gettime(clk_id, &tp) == 0) {
1084 if (info) {
1085 struct timespec res;
1086 info->implementation = function;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001087 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001088 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001089 if (clock_getres(clk_id, &res) == 0)
1090 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
1091 else
1092 info->resolution = 1e-9;
1093 }
1094 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
1095 }
1096#endif
1097
1098#if defined(HAVE_SYS_RESOURCE_H)
1099 if (getrusage(RUSAGE_SELF, &ru) == 0) {
1100 double total;
1101 total = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec * 1e-6;
1102 total += ru.ru_stime.tv_sec + ru.ru_stime.tv_usec * 1e-6;
1103 if (info) {
1104 info->implementation = "getrusage(RUSAGE_SELF)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001105 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001106 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001107 info->resolution = 1e-6;
1108 }
1109 return PyFloat_FromDouble(total);
1110 }
1111#endif
1112
1113#ifdef HAVE_TIMES
1114 if (times(&t) != (clock_t)-1) {
1115 double total;
1116
1117 if (ticks_per_second == -1) {
1118#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
1119 ticks_per_second = sysconf(_SC_CLK_TCK);
1120 if (ticks_per_second < 1)
1121 ticks_per_second = -1;
1122#elif defined(HZ)
1123 ticks_per_second = HZ;
1124#else
1125 ticks_per_second = 60; /* magic fallback value; may be bogus */
1126#endif
1127 }
1128
1129 if (ticks_per_second != -1) {
1130 total = (double)t.tms_utime / ticks_per_second;
1131 total += (double)t.tms_stime / ticks_per_second;
1132 if (info) {
1133 info->implementation = "times()";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001134 info->monotonic = 1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001135 info->adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001136 info->resolution = 1.0 / ticks_per_second;
1137 }
1138 return PyFloat_FromDouble(total);
1139 }
1140 }
1141#endif
1142
1143 return floatclock(info);
1144#endif
1145}
1146
1147static PyObject *
1148time_process_time(PyObject *self, PyObject *unused)
1149{
1150 return py_process_time(NULL);
1151}
1152
1153PyDoc_STRVAR(process_time_doc,
1154"process_time() -> float\n\
1155\n\
1156Process time for profiling: sum of the kernel and user-space CPU time.");
1157
1158
Victor Stinnerec895392012-04-29 02:41:27 +02001159static PyObject *
1160time_get_clock_info(PyObject *self, PyObject *args)
1161{
1162 char *name;
Victor Stinnerec895392012-04-29 02:41:27 +02001163 _Py_clock_info_t info;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001164 PyObject *obj = NULL, *dict, *ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001165
1166 if (!PyArg_ParseTuple(args, "s:get_clock_info", &name))
1167 return NULL;
1168
1169#ifdef Py_DEBUG
1170 info.implementation = NULL;
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001171 info.monotonic = -1;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001172 info.adjustable = -1;
Victor Stinnerec895392012-04-29 02:41:27 +02001173 info.resolution = -1.0;
1174#else
1175 info.implementation = "";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001176 info.monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001177 info.adjustable = 0;
Victor Stinnerec895392012-04-29 02:41:27 +02001178 info.resolution = 1.0;
1179#endif
1180
1181 if (strcmp(name, "time") == 0)
1182 obj = floattime(&info);
1183#ifdef PYCLOCK
1184 else if (strcmp(name, "clock") == 0)
1185 obj = pyclock(&info);
1186#endif
1187#ifdef PYMONOTONIC
1188 else if (strcmp(name, "monotonic") == 0)
1189 obj = pymonotonic(&info);
1190#endif
1191 else if (strcmp(name, "perf_counter") == 0)
1192 obj = perf_counter(&info);
1193 else if (strcmp(name, "process_time") == 0)
1194 obj = py_process_time(&info);
1195 else {
1196 PyErr_SetString(PyExc_ValueError, "unknown clock");
1197 return NULL;
1198 }
1199 if (obj == NULL)
1200 return NULL;
1201 Py_DECREF(obj);
1202
Victor Stinnerbda4b882012-06-12 22:11:44 +02001203 dict = PyDict_New();
1204 if (dict == NULL)
Victor Stinnerec895392012-04-29 02:41:27 +02001205 return NULL;
1206
1207 assert(info.implementation != NULL);
1208 obj = PyUnicode_FromString(info.implementation);
1209 if (obj == NULL)
1210 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001211 if (PyDict_SetItemString(dict, "implementation", obj) == -1)
1212 goto error;
1213 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001214
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001215 assert(info.monotonic != -1);
1216 obj = PyBool_FromLong(info.monotonic);
Victor Stinnerec895392012-04-29 02:41:27 +02001217 if (obj == NULL)
1218 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001219 if (PyDict_SetItemString(dict, "monotonic", obj) == -1)
1220 goto error;
1221 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001222
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001223 assert(info.adjustable != -1);
1224 obj = PyBool_FromLong(info.adjustable);
Victor Stinnerec895392012-04-29 02:41:27 +02001225 if (obj == NULL)
1226 goto error;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001227 if (PyDict_SetItemString(dict, "adjustable", obj) == -1)
Victor Stinnerbda4b882012-06-12 22:11:44 +02001228 goto error;
1229 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001230
1231 assert(info.resolution > 0.0);
1232 assert(info.resolution <= 1.0);
1233 obj = PyFloat_FromDouble(info.resolution);
1234 if (obj == NULL)
1235 goto error;
Victor Stinnerbda4b882012-06-12 22:11:44 +02001236 if (PyDict_SetItemString(dict, "resolution", obj) == -1)
1237 goto error;
1238 Py_CLEAR(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001239
Victor Stinnerbda4b882012-06-12 22:11:44 +02001240 ns = _PyNamespace_New(dict);
1241 Py_DECREF(dict);
1242 return ns;
Victor Stinnerec895392012-04-29 02:41:27 +02001243
1244error:
Victor Stinnerbda4b882012-06-12 22:11:44 +02001245 Py_DECREF(dict);
1246 Py_XDECREF(obj);
Victor Stinnerec895392012-04-29 02:41:27 +02001247 return NULL;
1248}
1249
1250PyDoc_STRVAR(get_clock_info_doc,
1251"get_clock_info(name: str) -> dict\n\
1252\n\
1253Get information of the specified clock.");
Victor Stinner8b302012012-02-07 23:29:46 +01001254
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001255static void
Martin v. Löwis1a214512008-06-11 05:26:20 +00001256PyInit_timezone(PyObject *m) {
1257 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 time_tzset. In the future, some parts of it can be moved back
1259 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
1260 are), and the extraneous calls to tzset(3) should be removed.
1261 I haven't done this yet, as I don't want to change this code as
1262 little as possible when introducing the time.tzset and time.tzsetwall
1263 methods. This should simply be a method of doing the following once,
1264 at the top of this function and removing the call to tzset() from
1265 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 #ifdef HAVE_TZSET
1268 tzset()
1269 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001272 */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001273#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 PyObject *otz0, *otz1;
1275 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +00001276#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +00001278#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +00001280#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001281#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001283#else
Guido van Rossum26452411998-09-28 22:07:11 +00001284#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +00001286#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +00001288#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +01001291 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
1292 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +00001294#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001295#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 {
Guido van Rossum234f9421993-06-17 12:35:49 +00001297#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 time_t t;
1299 struct tm *p;
1300 long janzone, julyzone;
1301 char janname[10], julyname[10];
1302 t = (time((time_t *)0) / YEAR) * YEAR;
1303 p = localtime(&t);
1304 janzone = -p->tm_gmtoff;
1305 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
1306 janname[9] = '\0';
1307 t += YEAR/2;
1308 p = localtime(&t);
1309 julyzone = -p->tm_gmtoff;
1310 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
1311 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if( janzone < julyzone ) {
1314 /* DST is reversed in the southern hemisphere */
1315 PyModule_AddIntConstant(m, "timezone", julyzone);
1316 PyModule_AddIntConstant(m, "altzone", janzone);
1317 PyModule_AddIntConstant(m, "daylight",
1318 janzone != julyzone);
1319 PyModule_AddObject(m, "tzname",
1320 Py_BuildValue("(zz)",
1321 julyname, janname));
1322 } else {
1323 PyModule_AddIntConstant(m, "timezone", janzone);
1324 PyModule_AddIntConstant(m, "altzone", julyzone);
1325 PyModule_AddIntConstant(m, "daylight",
1326 janzone != julyzone);
1327 PyModule_AddObject(m, "tzname",
1328 Py_BuildValue("(zz)",
1329 janname, julyname));
1330 }
1331 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +00001332#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001333#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +00001334#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 tzset();
1336 PyModule_AddIntConstant(m, "timezone", _timezone);
1337 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
1338 PyModule_AddIntConstant(m, "daylight", _daylight);
1339 PyModule_AddObject(m, "tzname",
1340 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +00001341#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +00001342#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +02001343
Victor Stinnerec895392012-04-29 02:41:27 +02001344#if defined(HAVE_CLOCK_GETTIME)
Victor Stinnere0be4232011-10-25 13:06:09 +02001345 PyModule_AddIntMacro(m, CLOCK_REALTIME);
Victor Stinnere0be4232011-10-25 13:06:09 +02001346#ifdef CLOCK_MONOTONIC
1347 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
1348#endif
1349#ifdef CLOCK_MONOTONIC_RAW
1350 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
1351#endif
Victor Stinner1470f352012-04-03 00:31:17 +02001352#ifdef CLOCK_HIGHRES
1353 PyModule_AddIntMacro(m, CLOCK_HIGHRES);
1354#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001355#ifdef CLOCK_PROCESS_CPUTIME_ID
1356 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
1357#endif
1358#ifdef CLOCK_THREAD_CPUTIME_ID
1359 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
1360#endif
1361#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001362}
1363
1364
1365static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +01001366 {"time", time_time, METH_NOARGS, time_doc},
Victor Stinnerec895392012-04-29 02:41:27 +02001367#ifdef PYCLOCK
Victor Stinner4195b5c2012-02-08 23:03:19 +01001368 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001369#endif
Victor Stinnere0be4232011-10-25 13:06:09 +02001370#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001371 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinner30d79472012-04-03 00:45:07 +02001372 {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
Victor Stinner4195b5c2012-02-08 23:03:19 +01001373 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +02001374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
1376 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
1377 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
1378 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
1379 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001380#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +01001381 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001382#endif
1383#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001387#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001389#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001390#ifdef PYMONOTONIC
1391 {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
1392#endif
1393 {"process_time", time_process_time, METH_NOARGS, process_time_doc},
1394 {"perf_counter", time_perf_counter, METH_NOARGS, perf_counter_doc},
1395 {"get_clock_info", time_get_clock_info, METH_VARARGS, get_clock_info_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001397};
1398
1399
1400PyDoc_STRVAR(module_doc,
1401"This module provides various functions to manipulate time values.\n\
1402\n\
1403There are two standard representations of time. One is the number\n\
1404of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1405or a floating point number (to represent fractions of seconds).\n\
1406The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1407The actual value can be retrieved by calling gmtime(0).\n\
1408\n\
1409The other representation is a tuple of 9 integers giving local time.\n\
1410The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001411 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001412 month (1-12)\n\
1413 day (1-31)\n\
1414 hours (0-23)\n\
1415 minutes (0-59)\n\
1416 seconds (0-59)\n\
1417 weekday (0-6, Monday is 0)\n\
1418 Julian day (day in the year, 1-366)\n\
1419 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1420If the DST flag is 0, the time is given in the regular time zone;\n\
1421if it is 1, the time is given in the DST time zone;\n\
1422if it is -1, mktime() should guess based on the date and time.\n\
1423\n\
1424Variables:\n\
1425\n\
1426timezone -- difference in seconds between UTC and local standard time\n\
1427altzone -- difference in seconds between UTC and local DST time\n\
1428daylight -- whether local time should reflect DST\n\
1429tzname -- tuple of (standard time zone name, DST time zone name)\n\
1430\n\
1431Functions:\n\
1432\n\
1433time() -- return current time in seconds since the Epoch as a float\n\
1434clock() -- return CPU time since process start as a float\n\
1435sleep() -- delay for a number of seconds given as a float\n\
1436gmtime() -- convert seconds since Epoch to UTC tuple\n\
1437localtime() -- convert seconds since Epoch to local time tuple\n\
1438asctime() -- convert time tuple to string\n\
1439ctime() -- convert time in seconds to string\n\
1440mktime() -- convert local time tuple to seconds since Epoch\n\
1441strftime() -- convert time tuple to string according to format specification\n\
1442strptime() -- parse string to time tuple according to format specification\n\
1443tzset() -- change the local timezone");
1444
1445
Martin v. Löwis1a214512008-06-11 05:26:20 +00001446
1447static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 PyModuleDef_HEAD_INIT,
1449 "time",
1450 module_doc,
1451 -1,
1452 time_methods,
1453 NULL,
1454 NULL,
1455 NULL,
1456 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001457};
1458
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001459PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001460PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 m = PyModule_Create(&timemodule);
1464 if (m == NULL)
1465 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 /* Set, or reset, module variables like time.timezone */
1468 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 if (!initialized) {
1471 PyStructSequence_InitType(&StructTimeType,
1472 &struct_time_type_desc);
Victor Stinnerec895392012-04-29 02:41:27 +02001473
Victor Stinnerec895392012-04-29 02:41:27 +02001474#ifdef MS_WINDOWS
1475 winver.dwOSVersionInfoSize = sizeof(winver);
1476 if (!GetVersionEx((OSVERSIONINFO*)&winver)) {
1477 Py_DECREF(m);
1478 PyErr_SetFromWindowsErr(0);
1479 return NULL;
1480 }
1481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 }
1483 Py_INCREF(&StructTimeType);
Alexander Belopolskyc142bba2012-06-13 22:15:26 -04001484#ifdef HAVE_STRUCT_TM_TM_ZONE
1485 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11);
1486#else
1487 PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 9);
1488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1490 initialized = 1;
1491 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001492}
1493
Victor Stinner071eca32012-03-15 01:17:09 +01001494static PyObject*
Victor Stinnerec895392012-04-29 02:41:27 +02001495floattime(_Py_clock_info_t *info)
Victor Stinner4195b5c2012-02-08 23:03:19 +01001496{
1497 _PyTime_timeval t;
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001498#ifdef HAVE_CLOCK_GETTIME
1499 struct timespec tp;
1500 int ret;
1501
1502 /* _PyTime_gettimeofday() does not use clock_gettime()
1503 because it would require to link Python to the rt (real-time)
1504 library, at least on Linux */
1505 ret = clock_gettime(CLOCK_REALTIME, &tp);
Victor Stinnerec895392012-04-29 02:41:27 +02001506 if (ret == 0) {
1507 if (info) {
1508 struct timespec res;
1509 info->implementation = "clock_gettime(CLOCK_REALTIME)";
Benjamin Peterson49a69e42012-05-01 09:38:34 -04001510 info->monotonic = 0;
Victor Stinner2b89fdf2012-06-12 22:46:37 +02001511 info->adjustable = 1;
Victor Stinnerec895392012-04-29 02:41:27 +02001512 if (clock_getres(CLOCK_REALTIME, &res) == 0)
1513 info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
1514 else
1515 info->resolution = 1e-9;
1516 }
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001517 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnerec895392012-04-29 02:41:27 +02001518 }
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001519#endif
Victor Stinnerec895392012-04-29 02:41:27 +02001520 _PyTime_gettimeofday_info(&t, info);
Victor Stinner70b2e1e2012-03-26 22:08:02 +02001521 return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
Victor Stinner4195b5c2012-02-08 23:03:19 +01001522}
1523
1524
Guido van Rossumb6775db1994-08-01 11:34:53 +00001525/* Implement floatsleep() for various platforms.
1526 When interrupted (or when another error occurs), return -1 and
1527 set an exception; else return 0. */
1528
1529static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001530floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001531{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001532/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001533#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 struct timeval t;
1535 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001536 int err;
1537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 frac = fmod(secs, 1.0);
1539 secs = floor(secs);
1540 t.tv_sec = (long)secs;
1541 t.tv_usec = (long)(frac*1000000.0);
1542 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001543 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1544 Py_END_ALLOW_THREADS
1545 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001546#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001547 if (errno == EINTR) {
1548 if (PyErr_CheckSignals())
1549 return -1;
1550 }
1551 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001552#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001553 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 PyErr_SetFromErrno(PyExc_IOError);
1555 return -1;
1556 }
1557 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001558#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 /* XXX Can't interrupt this sleep */
1560 Py_BEGIN_ALLOW_THREADS
1561 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1562 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001563#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 {
1565 double millisecs = secs * 1000.0;
1566 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (millisecs > (double)ULONG_MAX) {
1569 PyErr_SetString(PyExc_OverflowError,
1570 "sleep length is too large");
1571 return -1;
1572 }
1573 Py_BEGIN_ALLOW_THREADS
1574 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1575 * by Guido, only the main thread can be interrupted.
1576 */
1577 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001578 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 Sleep(ul_millis);
1580 else {
1581 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001582 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 ResetEvent(hInterruptEvent);
1584 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1585 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 Py_BLOCK_THREADS
1587 errno = EINTR;
1588 PyErr_SetFromErrno(PyExc_IOError);
1589 return -1;
1590 }
1591 }
1592 Py_END_ALLOW_THREADS
1593 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001594#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 /* This Sleep *IS* Interruptable by Exceptions */
1596 Py_BEGIN_ALLOW_THREADS
1597 if (DosSleep(secs * 1000) != NO_ERROR) {
1598 Py_BLOCK_THREADS
1599 PyErr_SetFromErrno(PyExc_IOError);
1600 return -1;
1601 }
1602 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 /* XXX Can't interrupt this sleep */
1605 Py_BEGIN_ALLOW_THREADS
1606 sleep((int)secs);
1607 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001608#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001611}