blob: f44e0c40c4eb93bba2a51ea6a28e20071c5101a8 [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
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +00008#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +00009#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum6d946f91992-08-14 13:49:30 +000010
Guido van Rossumb6775db1994-08-01 11:34:53 +000011#ifdef QUICKWIN
12#include <io.h>
13#endif
14
Guido van Rossum7bf22de1997-12-02 20:34:19 +000015#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossumbceeac81996-05-23 22:53:47 +000016#include <i86.h>
17#else
Guido van Rossumcac6c721996-09-06 13:34:02 +000018#ifdef MS_WINDOWS
Mark Hammond975e3922002-07-16 01:29:19 +000019#define WIN32_LEAN_AND_MEAN
Guido van Rossum258ccd42001-03-02 06:53:29 +000020#include <windows.h>
Mark Hammond975e3922002-07-16 01:29:19 +000021#include "pythread.h"
22
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000023#if defined(__BORLANDC__)
Guido van Rossumb2fb3641996-09-07 00:47:35 +000024/* These overrides not needed for Win32 */
Guido van Rossumb6775db1994-08-01 11:34:53 +000025#define timezone _timezone
Guido van Rossumcc081121995-03-14 15:05:41 +000026#define tzname _tzname
27#define daylight _daylight
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000028#endif /* __BORLANDC__ */
Guido van Rossumcac6c721996-09-06 13:34:02 +000029#endif /* MS_WINDOWS */
Guido van Rossum7bf22de1997-12-02 20:34:19 +000030#endif /* !__WATCOMC__ || __QNX__ */
Guido van Rossum234f9421993-06-17 12:35:49 +000031
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000032#if defined(PYOS_OS2)
33#define INCL_DOS
34#define INCL_ERRORS
35#include <os2.h>
36#endif
37
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000038#if defined(PYCC_VACPP)
Guido van Rossum26452411998-09-28 22:07:11 +000039#include <sys/time.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000040#endif
41
Victor Stinnera8ec5ea2012-03-13 00:25:42 +010042#if defined(__APPLE__)
43#include <mach/mach_time.h>
44#endif
45
Guido van Rossum234f9421993-06-17 12:35:49 +000046/* Forward declarations */
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int floatsleep(double);
Victor Stinner071eca32012-03-15 01:17:09 +010048static PyObject* floattime(void);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
Barry Warsaw9a2a8a81996-12-06 23:32:14 +000050static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +010051time_time(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052{
Victor Stinner071eca32012-03-15 01:17:09 +010053 return floattime();
Guido van Rossumb6775db1994-08-01 11:34:53 +000054}
55
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000056PyDoc_STRVAR(time_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +010057"time() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +000058\n\
59Return the current time in seconds since the Epoch.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000060Fractions of a second may be present if the system clock provides them.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +000061
Victor Stinner85fdfa82012-01-27 00:38:48 +010062#if defined(HAVE_CLOCK)
63
64#ifndef CLOCKS_PER_SEC
65#ifdef CLK_TCK
66#define CLOCKS_PER_SEC CLK_TCK
67#else
68#define CLOCKS_PER_SEC 1000000
69#endif
70#endif
71
Victor Stinner4195b5c2012-02-08 23:03:19 +010072static PyObject *
73pyclock(void)
Victor Stinner85fdfa82012-01-27 00:38:48 +010074{
Victor Stinner4195b5c2012-02-08 23:03:19 +010075 clock_t value;
76 value = clock();
77 if (value == (clock_t)-1) {
Victor Stinner85fdfa82012-01-27 00:38:48 +010078 PyErr_SetString(PyExc_RuntimeError,
79 "the processor time used is not available "
80 "or its value cannot be represented");
Victor Stinner4195b5c2012-02-08 23:03:19 +010081 return NULL;
Victor Stinner85fdfa82012-01-27 00:38:48 +010082 }
Victor Stinner4195b5c2012-02-08 23:03:19 +010083 return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
Victor Stinner85fdfa82012-01-27 00:38:48 +010084}
85#endif /* HAVE_CLOCK */
86
Thomas Wouters477c8d52006-05-27 19:21:47 +000087#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner9122fdd2011-07-04 13:55:40 +020088/* Win32 has better clock replacement; we have our own version, due to Mark
89 Hammond and Tim Peters */
Victor Stinner4195b5c2012-02-08 23:03:19 +010090static PyObject *
91win32_clock(int fallback)
Guido van Rossum3917c221997-04-02 05:35:28 +000092{
Victor Stinner8b302012012-02-07 23:29:46 +010093 static LONGLONG cpu_frequency = 0;
Victor Stinner4195b5c2012-02-08 23:03:19 +010094 static LONGLONG ctrStart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 LARGE_INTEGER now;
Victor Stinner4195b5c2012-02-08 23:03:19 +010096 double diff;
Guido van Rossum3917c221997-04-02 05:35:28 +000097
Victor Stinner8b302012012-02-07 23:29:46 +010098 if (cpu_frequency == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 LARGE_INTEGER freq;
Victor Stinner8b302012012-02-07 23:29:46 +0100100 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100101 ctrStart = now.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
103 /* Unlikely to happen - this works on all intel
104 machines at least! Revert to clock() */
Victor Stinner4195b5c2012-02-08 23:03:19 +0100105 if (fallback)
106 return pyclock();
107 else
108 return PyErr_SetFromWindowsErr(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 }
Victor Stinner8b302012012-02-07 23:29:46 +0100110 cpu_frequency = freq.QuadPart;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 }
112 QueryPerformanceCounter(&now);
Victor Stinner4195b5c2012-02-08 23:03:19 +0100113 diff = (double)(now.QuadPart - ctrStart);
114 return PyFloat_FromDouble(diff / (double)cpu_frequency);
Guido van Rossum3917c221997-04-02 05:35:28 +0000115}
Victor Stinner8b302012012-02-07 23:29:46 +0100116#endif
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000117
Victor Stinner8b302012012-02-07 23:29:46 +0100118#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200119static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100120time_clock(PyObject *self, PyObject *unused)
Victor Stinner9122fdd2011-07-04 13:55:40 +0200121{
Victor Stinner8b302012012-02-07 23:29:46 +0100122#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100123 return win32_clock(1);
Victor Stinner8b302012012-02-07 23:29:46 +0100124#else
Victor Stinner4195b5c2012-02-08 23:03:19 +0100125 return pyclock();
Victor Stinner8b302012012-02-07 23:29:46 +0100126#endif
Victor Stinner9122fdd2011-07-04 13:55:40 +0200127}
Victor Stinner9122fdd2011-07-04 13:55:40 +0200128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000129PyDoc_STRVAR(clock_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100130"clock() -> floating point number\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000131\n\
132Return the CPU time or real time since the start of the process or since\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000133the first call to clock(). This has as much precision as the system\n\
134records.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000135#endif
136
Victor Stinnere0be4232011-10-25 13:06:09 +0200137#ifdef HAVE_CLOCK_GETTIME
138static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100139time_clock_gettime(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200140{
141 int ret;
142 clockid_t clk_id;
143 struct timespec tp;
144
Victor Stinner4195b5c2012-02-08 23:03:19 +0100145 if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200146 return NULL;
147
148 ret = clock_gettime((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100149 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200150 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100151 return NULL;
152 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100153
154 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200155}
156
157PyDoc_STRVAR(clock_gettime_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100158"clock_gettime(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200159\n\
160Return the time of the specified clock clk_id.");
161#endif
162
163#ifdef HAVE_CLOCK_GETRES
164static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100165time_clock_getres(PyObject *self, PyObject *args)
Victor Stinnere0be4232011-10-25 13:06:09 +0200166{
167 int ret;
168 clockid_t clk_id;
169 struct timespec tp;
170
Victor Stinner4195b5c2012-02-08 23:03:19 +0100171 if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
Victor Stinnere0be4232011-10-25 13:06:09 +0200172 return NULL;
173
174 ret = clock_getres((clockid_t)clk_id, &tp);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100175 if (ret != 0) {
Victor Stinnere0be4232011-10-25 13:06:09 +0200176 PyErr_SetFromErrno(PyExc_IOError);
Antoine Pitrou2c085602012-01-18 01:41:44 +0100177 return NULL;
178 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100179
180 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinnere0be4232011-10-25 13:06:09 +0200181}
182
183PyDoc_STRVAR(clock_getres_doc,
Victor Stinner4195b5c2012-02-08 23:03:19 +0100184"clock_getres(clk_id) -> floating point number\n\
Victor Stinnere0be4232011-10-25 13:06:09 +0200185\n\
186Return the resolution (precision) of the specified clock clk_id.");
187#endif
188
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000189static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000190time_sleep(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 double secs;
193 if (!PyArg_ParseTuple(args, "d:sleep", &secs))
194 return NULL;
Victor Stinner7f53a502011-07-05 22:00:25 +0200195 if (secs < 0) {
196 PyErr_SetString(PyExc_ValueError,
197 "sleep length must be non-negative");
198 return NULL;
199 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 if (floatsleep(secs) != 0)
201 return NULL;
202 Py_INCREF(Py_None);
203 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204}
205
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000206PyDoc_STRVAR(sleep_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000207"sleep(seconds)\n\
208\n\
209Delay execution for a given number of seconds. The argument may be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000210a floating point number for subsecond precision.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000211
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000212static PyStructSequence_Field struct_time_type_fields[] = {
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000213 {"tm_year", "year, for example, 1993"},
214 {"tm_mon", "month of year, range [1, 12]"},
215 {"tm_mday", "day of month, range [1, 31]"},
216 {"tm_hour", "hours, range [0, 23]"},
217 {"tm_min", "minutes, range [0, 59]"},
218 {"tm_sec", "seconds, range [0, 61])"},
219 {"tm_wday", "day of week, range [0, 6], Monday is 0"},
220 {"tm_yday", "day of year, range [1, 366]"},
221 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000223};
224
225static PyStructSequence_Desc struct_time_type_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 "time.struct_time",
Alexander Belopolsky69f3fd02010-06-05 15:04:51 +0000227 "The time value as returned by gmtime(), localtime(), and strptime(), and\n"
228 " accepted by asctime(), mktime() and strftime(). May be considered as a\n"
229 " sequence of 9 integers.\n\n"
230 " Note that several fields' values are not the same as those defined by\n"
231 " the C language standard for struct tm. For example, the value of the\n"
232 " field tm_year is the actual year, not year - 1900. See individual\n"
233 " fields' descriptions for details.",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 struct_time_type_fields,
235 9,
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000236};
Tim Peters9ad4b682002-02-13 05:14:18 +0000237
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000238static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000239static PyTypeObject StructTimeType;
240
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000241static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000242tmtotuple(struct tm *p)
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 PyObject *v = PyStructSequence_New(&StructTimeType);
245 if (v == NULL)
246 return NULL;
Tim Peters9ad4b682002-02-13 05:14:18 +0000247
Christian Heimes217cfd12007-12-02 14:31:20 +0000248#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 SET(0, p->tm_year + 1900);
251 SET(1, p->tm_mon + 1); /* Want January == 1 */
252 SET(2, p->tm_mday);
253 SET(3, p->tm_hour);
254 SET(4, p->tm_min);
255 SET(5, p->tm_sec);
256 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
257 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
258 SET(8, p->tm_isdst);
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000259#undef SET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 if (PyErr_Occurred()) {
261 Py_XDECREF(v);
262 return NULL;
263 }
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 return v;
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000266}
267
Fred Drakef901abd2004-08-03 17:58:55 +0000268/* Parse arg tuple that can contain an optional float-or-None value;
269 format needs to be "|O:name".
270 Returns non-zero on success (parallels PyArg_ParseTuple).
271*/
272static int
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100273parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
Fred Drakef901abd2004-08-03 17:58:55 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyObject *ot = NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100276 time_t whent;
Fred Drakef901abd2004-08-03 17:58:55 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 if (!PyArg_ParseTuple(args, format, &ot))
279 return 0;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100280 if (ot == NULL || ot == Py_None) {
281 whent = time(NULL);
282 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 else {
Victor Stinner5d272cc2012-03-13 13:35:55 +0100284 if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100285 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 }
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100287 *pwhen = whent;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 return 1;
Fred Drakef901abd2004-08-03 17:58:55 +0000289}
290
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000291static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000292time_gmtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000293{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100294 time_t when;
295 struct tm buf, *local;
296
297 if (!parse_time_t_args(args, "|O:gmtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100299
300 errno = 0;
301 local = gmtime(&when);
302 if (local == NULL) {
303#ifdef EINVAL
304 if (errno == 0)
305 errno = EINVAL;
306#endif
307 return PyErr_SetFromErrno(PyExc_OSError);
308 }
309 buf = *local;
310 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000311}
312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000313PyDoc_STRVAR(gmtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000314"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\
Fred Drake193a3f62002-03-12 21:38:49 +0000315 tm_sec, tm_wday, tm_yday, tm_isdst)\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000316\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000317Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000318GMT). When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000319
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100320static int
321pylocaltime(time_t *timep, struct tm *result)
322{
323 struct tm *local;
324
325 assert (timep != NULL);
326 local = localtime(timep);
327 if (local == NULL) {
328 /* unconvertible time */
329#ifdef EINVAL
330 if (errno == 0)
331 errno = EINVAL;
332#endif
333 PyErr_SetFromErrno(PyExc_OSError);
334 return -1;
335 }
336 *result = *local;
337 return 0;
338}
339
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000340static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000341time_localtime(PyObject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000342{
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100343 time_t when;
344 struct tm buf;
345
346 if (!parse_time_t_args(args, "|O:localtime", &when))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100348 if (pylocaltime(&when, &buf) == 1)
349 return NULL;
350 return tmtotuple(&buf);
Guido van Rossum234f9421993-06-17 12:35:49 +0000351}
352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000353PyDoc_STRVAR(localtime_doc,
Christian Heimes9a371592007-12-28 14:08:13 +0000354"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 tm_sec,tm_wday,tm_yday,tm_isdst)\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000356\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000357Convert seconds since the Epoch to a time tuple expressing local time.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000358When 'seconds' is not passed in, convert the current time instead.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000359
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000360/* Convert 9-item tuple to tm structure. Return 1 on success, set
361 * an exception and return 0 on error.
362 */
Guido van Rossum9e90a671993-06-24 11:10:19 +0000363static int
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000364gettmarg(PyObject *args, struct tm *p)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 int y;
Guido van Rossumcfbaecc1998-08-25 14:51:12 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 memset((void *) p, '\0', sizeof(struct tm));
Guido van Rossumb9081262007-08-25 03:14:09 +0000369
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000370 if (!PyTuple_Check(args)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 PyErr_SetString(PyExc_TypeError,
372 "Tuple or struct_time argument required");
373 return 0;
374 }
Skip Montanaro41cfce92007-08-24 21:11:00 +0000375
Alexander Belopolsky610e5442011-01-06 21:57:06 +0000376 if (!PyArg_ParseTuple(args, "iiiiiiiii",
377 &y, &p->tm_mon, &p->tm_mday,
378 &p->tm_hour, &p->tm_min, &p->tm_sec,
379 &p->tm_wday, &p->tm_yday, &p->tm_isdst))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 p->tm_year = y - 1900;
382 p->tm_mon--;
383 p->tm_wday = (p->tm_wday + 1) % 7;
384 p->tm_yday--;
385 return 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +0000386}
387
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000388/* Check values of the struct tm fields before it is passed to strftime() and
389 * asctime(). Return 1 if all values are valid, otherwise set an exception
390 * and returns 0.
391 */
Victor Stinneref128102010-10-07 01:00:52 +0000392static int
393checktm(struct tm* buf)
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000394{
Victor Stinneref128102010-10-07 01:00:52 +0000395 /* Checks added to make sure strftime() and asctime() does not crash Python by
396 indexing blindly into some array for a textual representation
397 by some bad index (fixes bug #897625 and #6608).
398
399 Also support values of zero from Python code for arguments in which
400 that is out of range by forcing that value to the lowest value that
401 is valid (fixed bug #1520914).
402
403 Valid ranges based on what is allowed in struct tm:
404
405 - tm_year: [0, max(int)] (1)
406 - tm_mon: [0, 11] (2)
407 - tm_mday: [1, 31]
408 - tm_hour: [0, 23]
409 - tm_min: [0, 59]
410 - tm_sec: [0, 60]
411 - tm_wday: [0, 6] (1)
412 - tm_yday: [0, 365] (2)
413 - tm_isdst: [-max(int), max(int)]
414
415 (1) gettmarg() handles bounds-checking.
416 (2) Python's acceptable range is one greater than the range in C,
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000417 thus need to check against automatic decrement by gettmarg().
418 */
419 if (buf->tm_mon == -1)
420 buf->tm_mon = 0;
421 else if (buf->tm_mon < 0 || buf->tm_mon > 11) {
422 PyErr_SetString(PyExc_ValueError, "month out of range");
423 return 0;
424 }
425 if (buf->tm_mday == 0)
426 buf->tm_mday = 1;
427 else if (buf->tm_mday < 0 || buf->tm_mday > 31) {
428 PyErr_SetString(PyExc_ValueError, "day of month out of range");
429 return 0;
430 }
431 if (buf->tm_hour < 0 || buf->tm_hour > 23) {
432 PyErr_SetString(PyExc_ValueError, "hour out of range");
433 return 0;
434 }
435 if (buf->tm_min < 0 || buf->tm_min > 59) {
436 PyErr_SetString(PyExc_ValueError, "minute out of range");
437 return 0;
438 }
439 if (buf->tm_sec < 0 || buf->tm_sec > 61) {
440 PyErr_SetString(PyExc_ValueError, "seconds out of range");
441 return 0;
442 }
443 /* tm_wday does not need checking of its upper-bound since taking
444 ``% 7`` in gettmarg() automatically restricts the range. */
445 if (buf->tm_wday < 0) {
446 PyErr_SetString(PyExc_ValueError, "day of week out of range");
447 return 0;
448 }
449 if (buf->tm_yday == -1)
450 buf->tm_yday = 0;
451 else if (buf->tm_yday < 0 || buf->tm_yday > 365) {
452 PyErr_SetString(PyExc_ValueError, "day of year out of range");
453 return 0;
454 }
455 return 1;
456}
457
Victor Stinnerc1f32ca2011-10-14 02:36:13 +0200458#ifdef MS_WINDOWS
459 /* wcsftime() doesn't format correctly time zones, see issue #10653 */
460# undef HAVE_WCSFTIME
461#endif
462
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000463#ifdef HAVE_STRFTIME
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000464#ifdef HAVE_WCSFTIME
465#define time_char wchar_t
466#define format_time wcsftime
467#define time_strlen wcslen
468#else
469#define time_char char
470#define format_time strftime
471#define time_strlen strlen
472#endif
473
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000474static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000475time_strftime(PyObject *self, PyObject *args)
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 PyObject *tup = NULL;
478 struct tm buf;
479 const time_char *fmt;
Victor Stinnerb2904782010-09-29 10:34:19 +0000480#ifdef HAVE_WCSFTIME
481 wchar_t *format;
482#else
483 PyObject *format;
484#endif
Victor Stinneref128102010-10-07 01:00:52 +0000485 PyObject *format_arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 size_t fmtlen, buflen;
Victor Stinnerb2904782010-09-29 10:34:19 +0000487 time_char *outbuf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 size_t i;
Victor Stinnerb2904782010-09-29 10:34:19 +0000489 PyObject *ret = NULL;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 memset((void *) &buf, '\0', sizeof(buf));
Guido van Rossum1f41f841998-04-27 19:04:26 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 /* Will always expect a unicode string to be passed as format.
494 Given that there's no str type anymore in py3k this seems safe.
495 */
Victor Stinneref128102010-10-07 01:00:52 +0000496 if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return NULL;
Thomas Woutersfe385252001-01-19 23:16:56 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 if (tup == NULL) {
500 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100501 if (pylocaltime(&tt, &buf) == -1)
502 return NULL;
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000503 }
504 else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return NULL;
Guido van Rossum10b164a2001-09-25 13:59:01 +0000506
Victor Stinner06ec45e2011-01-08 03:35:36 +0000507#if defined(_MSC_VER) || defined(sun)
Victor Stinner73ea29c2011-01-08 01:56:31 +0000508 if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
Victor Stinner6f0e4f92011-03-21 02:14:53 +0100509 PyErr_SetString(PyExc_ValueError,
510 "strftime() requires year in [1; 9999]");
Alexander Belopolsky0dd06f42011-01-08 01:23:02 +0000511 return NULL;
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000512 }
Victor Stinner73ea29c2011-01-08 01:56:31 +0000513#endif
Alexander Belopolskyc64708a2011-01-07 19:59:19 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 /* Normalize tm_isdst just in case someone foolishly implements %Z
516 based on the assumption that tm_isdst falls within the range of
517 [-1, 1] */
518 if (buf.tm_isdst < -1)
519 buf.tm_isdst = -1;
520 else if (buf.tm_isdst > 1)
521 buf.tm_isdst = 1;
Brett Cannond1080a32004-03-02 04:38:10 +0000522
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000523#ifdef HAVE_WCSFTIME
Victor Stinnerbeb4135b2010-10-07 01:02:42 +0000524 format = PyUnicode_AsWideCharString(format_arg, NULL);
Victor Stinnerb2904782010-09-29 10:34:19 +0000525 if (format == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return NULL;
Victor Stinnerb2904782010-09-29 10:34:19 +0000527 fmt = format;
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 /* Convert the unicode string to an ascii one */
Victor Stinner1b579672011-12-17 05:47:23 +0100530 format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (format == NULL)
532 return NULL;
533 fmt = PyBytes_AS_STRING(format);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000534#endif
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000535
Stefan Krah4aea7d32012-02-27 16:30:26 +0100536#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* check that the format string contains only valid directives */
Victor Stinner5a3ff792011-10-16 19:08:23 +0200538 for(outbuf = strchr(fmt, '%');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 outbuf != NULL;
Victor Stinner5a3ff792011-10-16 19:08:23 +0200540 outbuf = strchr(outbuf+2, '%'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 {
542 if (outbuf[1]=='#')
543 ++outbuf; /* not documented by python, */
544 if (outbuf[1]=='\0' ||
Victor Stinner5a3ff792011-10-16 19:08:23 +0200545 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 {
547 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Stefan Krah4aea7d32012-02-27 16:30:26 +0100548 Py_DECREF(format);
549 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 }
551 }
Amaury Forgeot d'Arcb5be6d42009-03-02 23:52:57 +0000552#endif
553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 fmtlen = time_strlen(fmt);
Guido van Rossumc222ec21999-02-23 00:00:10 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* I hate these functions that presume you know how big the output
557 * will be ahead of time...
558 */
559 for (i = 1024; ; i += i) {
Victor Stinner136ea492011-12-17 22:37:18 +0100560#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100561 int err;
Victor Stinner136ea492011-12-17 22:37:18 +0100562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
564 if (outbuf == NULL) {
Victor Stinnerb2904782010-09-29 10:34:19 +0000565 PyErr_NoMemory();
566 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 }
568 buflen = format_time(outbuf, i, fmt, &buf);
Victor Stinner136ea492011-12-17 22:37:18 +0100569#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100570 err = errno;
Victor Stinner136ea492011-12-17 22:37:18 +0100571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 if (buflen > 0 || i >= 256 * fmtlen) {
573 /* If the buffer is 256 times as long as the format,
574 it's probably not failing for lack of room!
575 More likely, the format yields an empty result,
576 e.g. an empty format, or %Z when the timezone
577 is unknown. */
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000578#ifdef HAVE_WCSFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 ret = PyUnicode_FromWideChar(outbuf, buflen);
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000580#else
Victor Stinner1b579672011-12-17 05:47:23 +0100581 ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
582 "surrogateescape");
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 PyMem_Free(outbuf);
Victor Stinnerb2904782010-09-29 10:34:19 +0000585 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 }
587 PyMem_Free(outbuf);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000588#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 /* VisualStudio .NET 2005 does this properly */
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100590 if (buflen == 0 && err == EINVAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 PyErr_SetString(PyExc_ValueError, "Invalid format string");
Victor Stinnerb2904782010-09-29 10:34:19 +0000592 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 }
Victor Stinnerb2904782010-09-29 10:34:19 +0000596#ifdef HAVE_WCSFTIME
597 PyMem_Free(format);
598#else
599 Py_DECREF(format);
600#endif
601 return ret;
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000602}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000603
Martin v. Löwis1b01ccd2009-05-30 06:13:40 +0000604#undef time_char
605#undef format_time
606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000607PyDoc_STRVAR(strftime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000608"strftime(format[, tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000609\n\
610Convert a time tuple to a string according to a format specification.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000611See the library reference manual for formatting codes. When the time tuple\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000612is not present, current time as returned by localtime() is used.");
Guido van Rossum8d8c1ee1995-09-13 17:38:35 +0000613#endif /* HAVE_STRFTIME */
614
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000615static PyObject *
616time_strptime(PyObject *self, PyObject *args)
617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
619 PyObject *strptime_result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200620 _Py_IDENTIFIER(_strptime_time);
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (!strptime_module)
623 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200624 strptime_result = _PyObject_CallMethodId(strptime_module,
625 &PyId__strptime_time, "O", args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 Py_DECREF(strptime_module);
627 return strptime_result;
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000628}
629
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000631PyDoc_STRVAR(strptime_doc,
Brett Cannon20def8b2003-07-01 05:16:08 +0000632"strptime(string, format) -> struct_time\n\
Martin v. Löwisb3cfc1d2001-12-02 12:27:43 +0000633\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000634Parse a string to a time tuple according to a format specification.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000635See the library reference manual for formatting codes (same as strftime()).");
Guido van Rossumd3c46d52002-07-19 17:06:47 +0000636
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000637static PyObject *
638_asctime(struct tm *timeptr)
639{
640 /* Inspired by Open Group reference implementation available at
641 * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
Victor Stinner499dfcf2011-03-21 13:26:24 +0100642 static char wday_name[7][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000643 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
644 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100645 static char mon_name[12][4] = {
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000646 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
647 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
648 };
Victor Stinner499dfcf2011-03-21 13:26:24 +0100649 return PyUnicode_FromFormat(
650 "%s %s%3d %.2d:%.2d:%.2d %d",
651 wday_name[timeptr->tm_wday],
652 mon_name[timeptr->tm_mon],
653 timeptr->tm_mday, timeptr->tm_hour,
654 timeptr->tm_min, timeptr->tm_sec,
655 1900 + timeptr->tm_year);
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000656}
Guido van Rossum87ce7bb1998-06-09 16:30:31 +0000657
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000658static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000659time_asctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 PyObject *tup = NULL;
662 struct tm buf;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))
665 return NULL;
666 if (tup == NULL) {
667 time_t tt = time(NULL);
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100668 if (pylocaltime(&tt, &buf) == -1)
669 return NULL;
670
Alexander Belopolsky38e29962010-10-01 14:18:49 +0000671 } else if (!gettmarg(tup, &buf) || !checktm(&buf))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 return NULL;
Alexander Belopolskyb9588b52011-01-04 16:34:30 +0000673 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000674}
675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000676PyDoc_STRVAR(asctime_doc,
Thomas Woutersfe385252001-01-19 23:16:56 +0000677"asctime([tuple]) -> string\n\
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000678\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000679Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
680When the time tuple is not present, current time as returned by localtime()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000681is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000682
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000683static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000684time_ctime(PyObject *self, PyObject *args)
Guido van Rossum9e90a671993-06-24 11:10:19 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 time_t tt;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100687 struct tm buf;
688 if (!parse_time_t_args(args, "|O:ctime", &tt))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100690 if (pylocaltime(&tt, &buf) == -1)
Alexander Belopolsky5da468f2011-01-04 17:15:52 +0000691 return NULL;
Victor Stinnerc1b5d342012-01-27 00:08:48 +0100692 return _asctime(&buf);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000693}
694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000695PyDoc_STRVAR(ctime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000696"ctime(seconds) -> string\n\
697\n\
698Convert a time in seconds since the Epoch to a string in local time.\n\
Thomas Woutersfe385252001-01-19 23:16:56 +0000699This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000700not present, current time as returned by localtime() is used.");
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000701
Guido van Rossum60cd8131998-03-06 17:16:21 +0000702#ifdef HAVE_MKTIME
Barry Warsaw9a2a8a81996-12-06 23:32:14 +0000703static PyObject *
Victor Stinner4195b5c2012-02-08 23:03:19 +0100704time_mktime(PyObject *self, PyObject *tup)
Guido van Rossum234f9421993-06-17 12:35:49 +0000705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 struct tm buf;
707 time_t tt;
708 if (!gettmarg(tup, &buf))
709 return NULL;
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000710 buf.tm_wday = -1; /* sentinel; original value ignored */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 tt = mktime(&buf);
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000712 /* Return value of -1 does not necessarily mean an error, but tm_wday
Ezio Melotti13925002011-03-16 11:05:33 +0200713 * cannot remain set to -1 if mktime succeeded. */
Alexander Belopolskyb7d40d12011-01-11 01:21:25 +0000714 if (tt == (time_t)(-1) && buf.tm_wday == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 PyErr_SetString(PyExc_OverflowError,
716 "mktime argument out of range");
717 return NULL;
718 }
Victor Stinner4195b5c2012-02-08 23:03:19 +0100719 return PyFloat_FromDouble((double)tt);
Guido van Rossum234f9421993-06-17 12:35:49 +0000720}
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000722PyDoc_STRVAR(mktime_doc,
Guido van Rossum0ef577b1998-06-27 20:38:36 +0000723"mktime(tuple) -> floating point number\n\
724\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000725Convert a time tuple in local time to seconds since the Epoch.");
Guido van Rossum60cd8131998-03-06 17:16:21 +0000726#endif /* HAVE_MKTIME */
Guido van Rossum234f9421993-06-17 12:35:49 +0000727
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000728#ifdef HAVE_WORKING_TZSET
Martin v. Löwis1a214512008-06-11 05:26:20 +0000729static void PyInit_timezone(PyObject *module);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000731static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000732time_tzset(PyObject *self, PyObject *unused)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 PyObject* m;
Fred Drake9bb74322002-04-01 14:49:59 +0000735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 m = PyImport_ImportModuleNoBlock("time");
737 if (m == NULL) {
738 return NULL;
739 }
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 tzset();
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 /* Reset timezone, altzone, daylight and tzname */
744 PyInit_timezone(m);
745 Py_DECREF(m);
Tim Peters1b6f7a92004-06-20 02:50:16 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 Py_INCREF(Py_None);
748 return Py_None;
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000749}
750
751PyDoc_STRVAR(tzset_doc,
R. David Murray4d55bf92010-12-14 00:55:46 +0000752"tzset()\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000753\n\
754Initialize, or reinitialize, the local timezone to the value stored in\n\
755os.environ['TZ']. The TZ environment variable should be specified in\n\
Neal Norwitzdc8e1942004-07-20 22:34:37 +0000756standard Unix timezone format as documented in the tzset man page\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000757(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\
758fall back to UTC. If the TZ environment variable is not set, the local\n\
759timezone is set to the systems best guess of wallclock time.\n\
760Changing the TZ environment variable without calling tzset *may* change\n\
761the local timezone used by methods such as localtime, but this behaviour\n\
762should not be relied on.");
763#endif /* HAVE_WORKING_TZSET */
764
Victor Stinner071eca32012-03-15 01:17:09 +0100765static PyObject*
766steady_clock(int strict)
Victor Stinnerb94b2662012-01-18 01:50:21 +0100767{
768#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
Victor Stinner071eca32012-03-15 01:17:09 +0100769 return win32_clock(!strict);
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100770#elif defined(__APPLE__)
Victor Stinner74eb6c02012-03-28 02:50:46 +0200771 static mach_timebase_info_data_t timebase;
772 uint64_t time;
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100773 double secs;
774
Victor Stinner74eb6c02012-03-28 02:50:46 +0200775 if (timebase.denom == 0) {
776 /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
777 fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
778 (void)mach_timebase_info(&timebase);
779 }
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100780
Victor Stinner74eb6c02012-03-28 02:50:46 +0200781 time = mach_absolute_time();
Victor Stinnera8ec5ea2012-03-13 00:25:42 +0100782 secs = (double)time * timebase.numer / timebase.denom * 1e-9;
783
784 return PyFloat_FromDouble(secs);
Victor Stinnerec919cc2012-03-15 00:58:32 +0100785#elif defined(HAVE_CLOCK_GETTIME)
Victor Stinner84860762012-03-26 22:53:14 +0200786 static int steady_clk_index = 0;
787 static int monotonic_clk_index = 0;
788 int *clk_index;
789 clockid_t steady_clk_ids[] = {
Victor Stinner8b302012012-02-07 23:29:46 +0100790#ifdef CLOCK_MONOTONIC_RAW
791 CLOCK_MONOTONIC_RAW,
792#endif
Victor Stinnerec919cc2012-03-15 00:58:32 +0100793 CLOCK_MONOTONIC,
794 CLOCK_REALTIME
Victor Stinner8b302012012-02-07 23:29:46 +0100795 };
Victor Stinner84860762012-03-26 22:53:14 +0200796 clockid_t monotonic_clk_ids[] = {
797#ifdef CLOCK_MONOTONIC_RAW
798 CLOCK_MONOTONIC_RAW,
799#endif
800 CLOCK_MONOTONIC
801 };
802 clockid_t *clk_ids;
803 int clk_ids_len;
Victor Stinner8b302012012-02-07 23:29:46 +0100804 int ret;
805 struct timespec tp;
806
Victor Stinner84860762012-03-26 22:53:14 +0200807 if (strict) {
808 clk_index = &monotonic_clk_index;
809 clk_ids = monotonic_clk_ids;
810 clk_ids_len = Py_ARRAY_LENGTH(monotonic_clk_ids);
811 }
812 else {
813 clk_index = &steady_clk_index;
814 clk_ids = steady_clk_ids;
815 clk_ids_len = Py_ARRAY_LENGTH(steady_clk_ids);
816 }
817
818 while (0 <= *clk_index) {
819 clockid_t clk_id = clk_ids[*clk_index];
Victor Stinner8b302012012-02-07 23:29:46 +0100820 ret = clock_gettime(clk_id, &tp);
821 if (ret == 0)
Victor Stinner4195b5c2012-02-08 23:03:19 +0100822 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
Victor Stinner8b302012012-02-07 23:29:46 +0100823
Victor Stinner84860762012-03-26 22:53:14 +0200824 (*clk_index)++;
825 if (clk_ids_len <= *clk_index)
826 (*clk_index) = -1;
Victor Stinner8b302012012-02-07 23:29:46 +0100827 }
Victor Stinner071eca32012-03-15 01:17:09 +0100828 if (strict) {
829 PyErr_SetFromErrno(PyExc_OSError);
830 return NULL;
831 }
832 return floattime();
Victor Stinnerec919cc2012-03-15 00:58:32 +0100833#else
Victor Stinner071eca32012-03-15 01:17:09 +0100834 if (strict) {
835 PyErr_SetString(PyExc_NotImplementedError,
836 "no steady clock available on your platform");
837 return NULL;
838 }
839 return floattime();
Victor Stinner8b302012012-02-07 23:29:46 +0100840#endif
841}
842
Victor Stinner071eca32012-03-15 01:17:09 +0100843static PyObject *
844time_steady(PyObject *self, PyObject *args, PyObject *kwargs)
845{
846 static char *kwlist[] = {"strict", NULL};
847 int strict = 0;
848
849 if (!PyArg_ParseTupleAndKeywords(
850 args, kwargs, "|i:steady", kwlist,
851 &strict))
852 return NULL;
853
854 return steady_clock(strict);
855}
856
Victor Stinnerec919cc2012-03-15 00:58:32 +0100857PyDoc_STRVAR(steady_doc,
Victor Stinner071eca32012-03-15 01:17:09 +0100858"steady(strict=False) -> float\n\
Victor Stinner8b302012012-02-07 23:29:46 +0100859\n\
Victor Stinnerec919cc2012-03-15 00:58:32 +0100860Return the current time as a floating point number expressed in seconds.\n\
861This clock advances at a steady rate relative to real time and it may not\n\
862be adjusted. The reference point of the returned value is undefined so only\n\
863the difference of consecutive calls is valid.");
864
Victor Stinner8b302012012-02-07 23:29:46 +0100865
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000866static void
Martin v. Löwis1a214512008-06-11 05:26:20 +0000867PyInit_timezone(PyObject *m) {
868 /* This code moved from PyInit_time wholesale to allow calling it from
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 time_tzset. In the future, some parts of it can be moved back
870 (for platforms that don't HAVE_WORKING_TZSET, when we know what they
871 are), and the extraneous calls to tzset(3) should be removed.
872 I haven't done this yet, as I don't want to change this code as
873 little as possible when introducing the time.tzset and time.tzsetwall
874 methods. This should simply be a method of doing the following once,
875 at the top of this function and removing the call to tzset() from
876 time_tzset():
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 #ifdef HAVE_TZSET
879 tzset()
880 #endif
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 And I'm lazy and hate C so nyer.
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000883 */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000884#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 PyObject *otz0, *otz1;
886 tzset();
Guido van Rossum26452411998-09-28 22:07:11 +0000887#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 PyModule_AddIntConstant(m, "timezone", _timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000889#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 PyModule_AddIntConstant(m, "timezone", timezone);
Guido van Rossum26452411998-09-28 22:07:11 +0000891#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892#ifdef HAVE_ALTZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 PyModule_AddIntConstant(m, "altzone", altzone);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894#else
Guido van Rossum26452411998-09-28 22:07:11 +0000895#ifdef PYOS_OS2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000897#else /* !PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 PyModule_AddIntConstant(m, "altzone", timezone-3600);
Guido van Rossum26452411998-09-28 22:07:11 +0000899#endif /* PYOS_OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PyModule_AddIntConstant(m, "daylight", daylight);
Victor Stinner1b579672011-12-17 05:47:23 +0100902 otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
903 otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
Guido van Rossum10b164a2001-09-25 13:59:01 +0000905#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000906#ifdef HAVE_STRUCT_TM_TM_ZONE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 {
Guido van Rossum234f9421993-06-17 12:35:49 +0000908#define YEAR ((time_t)((365 * 24 + 6) * 3600))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 time_t t;
910 struct tm *p;
911 long janzone, julyzone;
912 char janname[10], julyname[10];
913 t = (time((time_t *)0) / YEAR) * YEAR;
914 p = localtime(&t);
915 janzone = -p->tm_gmtoff;
916 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9);
917 janname[9] = '\0';
918 t += YEAR/2;
919 p = localtime(&t);
920 julyzone = -p->tm_gmtoff;
921 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9);
922 julyname[9] = '\0';
Guido van Rossum10b164a2001-09-25 13:59:01 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 if( janzone < julyzone ) {
925 /* DST is reversed in the southern hemisphere */
926 PyModule_AddIntConstant(m, "timezone", julyzone);
927 PyModule_AddIntConstant(m, "altzone", janzone);
928 PyModule_AddIntConstant(m, "daylight",
929 janzone != julyzone);
930 PyModule_AddObject(m, "tzname",
931 Py_BuildValue("(zz)",
932 julyname, janname));
933 } else {
934 PyModule_AddIntConstant(m, "timezone", janzone);
935 PyModule_AddIntConstant(m, "altzone", julyzone);
936 PyModule_AddIntConstant(m, "daylight",
937 janzone != julyzone);
938 PyModule_AddObject(m, "tzname",
939 Py_BuildValue("(zz)",
940 janname, julyname));
941 }
942 }
Guido van Rossume6a4b7b1997-10-08 15:27:56 +0000943#else
Martin v. Löwis60a5d722002-10-16 20:28:25 +0000944#endif /* HAVE_STRUCT_TM_TM_ZONE */
Tim Peters26ae7cd2001-03-20 03:26:49 +0000945#ifdef __CYGWIN__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 tzset();
947 PyModule_AddIntConstant(m, "timezone", _timezone);
948 PyModule_AddIntConstant(m, "altzone", _timezone-3600);
949 PyModule_AddIntConstant(m, "daylight", _daylight);
950 PyModule_AddObject(m, "tzname",
951 Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
Tim Peters26ae7cd2001-03-20 03:26:49 +0000952#endif /* __CYGWIN__ */
Guido van Rossum10b164a2001-09-25 13:59:01 +0000953#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
Victor Stinnere0be4232011-10-25 13:06:09 +0200954
955#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETRES)
956#ifdef CLOCK_REALTIME
957 PyModule_AddIntMacro(m, CLOCK_REALTIME);
958#endif
959#ifdef CLOCK_MONOTONIC
960 PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
961#endif
962#ifdef CLOCK_MONOTONIC_RAW
963 PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
964#endif
965#ifdef CLOCK_PROCESS_CPUTIME_ID
966 PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
967#endif
968#ifdef CLOCK_THREAD_CPUTIME_ID
969 PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
970#endif
971#endif /* HAVE_CLOCK_GETTIME */
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000972}
973
974
975static PyMethodDef time_methods[] = {
Victor Stinner4195b5c2012-02-08 23:03:19 +0100976 {"time", time_time, METH_NOARGS, time_doc},
977#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK)
978 {"clock", time_clock, METH_NOARGS, clock_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000979#endif
Victor Stinnere0be4232011-10-25 13:06:09 +0200980#ifdef HAVE_CLOCK_GETTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +0100981 {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +0200982#endif
983#ifdef HAVE_CLOCK_GETRES
Victor Stinner4195b5c2012-02-08 23:03:19 +0100984 {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
Victor Stinnere0be4232011-10-25 13:06:09 +0200985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 {"sleep", time_sleep, METH_VARARGS, sleep_doc},
987 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
988 {"localtime", time_localtime, METH_VARARGS, localtime_doc},
989 {"asctime", time_asctime, METH_VARARGS, asctime_doc},
990 {"ctime", time_ctime, METH_VARARGS, ctime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000991#ifdef HAVE_MKTIME
Victor Stinner4195b5c2012-02-08 23:03:19 +0100992 {"mktime", time_mktime, METH_O, mktime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000993#endif
Victor Stinner071eca32012-03-15 01:17:09 +0100994 {"steady", (PyCFunction)time_steady, METH_VARARGS|METH_KEYWORDS,
995 steady_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000996#ifdef HAVE_STRFTIME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 {"strftime", time_strftime, METH_VARARGS, strftime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +0000998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 {"strptime", time_strptime, METH_VARARGS, strptime_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001000#ifdef HAVE_WORKING_TZSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 {"tzset", time_tzset, METH_NOARGS, tzset_doc},
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 {NULL, NULL} /* sentinel */
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001004};
1005
1006
1007PyDoc_STRVAR(module_doc,
1008"This module provides various functions to manipulate time values.\n\
1009\n\
1010There are two standard representations of time. One is the number\n\
1011of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\
1012or a floating point number (to represent fractions of seconds).\n\
1013The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\
1014The actual value can be retrieved by calling gmtime(0).\n\
1015\n\
1016The other representation is a tuple of 9 integers giving local time.\n\
1017The tuple items are:\n\
Alexander Belopolsky03163ac2011-05-02 12:20:52 -04001018 year (including century, e.g. 1998)\n\
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001019 month (1-12)\n\
1020 day (1-31)\n\
1021 hours (0-23)\n\
1022 minutes (0-59)\n\
1023 seconds (0-59)\n\
1024 weekday (0-6, Monday is 0)\n\
1025 Julian day (day in the year, 1-366)\n\
1026 DST (Daylight Savings Time) flag (-1, 0 or 1)\n\
1027If the DST flag is 0, the time is given in the regular time zone;\n\
1028if it is 1, the time is given in the DST time zone;\n\
1029if it is -1, mktime() should guess based on the date and time.\n\
1030\n\
1031Variables:\n\
1032\n\
1033timezone -- difference in seconds between UTC and local standard time\n\
1034altzone -- difference in seconds between UTC and local DST time\n\
1035daylight -- whether local time should reflect DST\n\
1036tzname -- tuple of (standard time zone name, DST time zone name)\n\
1037\n\
1038Functions:\n\
1039\n\
1040time() -- return current time in seconds since the Epoch as a float\n\
1041clock() -- return CPU time since process start as a float\n\
1042sleep() -- delay for a number of seconds given as a float\n\
1043gmtime() -- convert seconds since Epoch to UTC tuple\n\
1044localtime() -- convert seconds since Epoch to local time tuple\n\
1045asctime() -- convert time tuple to string\n\
1046ctime() -- convert time in seconds to string\n\
1047mktime() -- convert local time tuple to seconds since Epoch\n\
1048strftime() -- convert time tuple to string according to format specification\n\
1049strptime() -- parse string to time tuple according to format specification\n\
1050tzset() -- change the local timezone");
1051
1052
Martin v. Löwis1a214512008-06-11 05:26:20 +00001053
1054static struct PyModuleDef timemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyModuleDef_HEAD_INIT,
1056 "time",
1057 module_doc,
1058 -1,
1059 time_methods,
1060 NULL,
1061 NULL,
1062 NULL,
1063 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001064};
1065
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001066PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001067PyInit_time(void)
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 PyObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 m = PyModule_Create(&timemodule);
1071 if (m == NULL)
1072 return NULL;
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 /* Set, or reset, module variables like time.timezone */
1075 PyInit_timezone(m);
Guido van Rossumd11b62e2003-03-14 21:51:36 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 if (!initialized) {
1078 PyStructSequence_InitType(&StructTimeType,
1079 &struct_time_type_desc);
1080 }
1081 Py_INCREF(&StructTimeType);
1082 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
1083 initialized = 1;
1084 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085}
1086
Victor Stinner071eca32012-03-15 01:17:09 +01001087static PyObject*
Victor Stinner4195b5c2012-02-08 23:03:19 +01001088floattime(void)
1089{
1090 _PyTime_timeval t;
Victor Stinnerad95c2d2012-03-28 02:54:15 +02001091#ifdef HAVE_CLOCK_GETTIME
1092 struct timespec tp;
1093 int ret;
1094
1095 /* _PyTime_gettimeofday() does not use clock_gettime()
1096 because it would require to link Python to the rt (real-time)
1097 library, at least on Linux */
1098 ret = clock_gettime(CLOCK_REALTIME, &tp);
1099 if (ret == 0)
1100 return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
1101#endif
Victor Stinner4195b5c2012-02-08 23:03:19 +01001102 _PyTime_gettimeofday(&t);
Victor Stinner70b2e1e2012-03-26 22:08:02 +02001103 return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
Victor Stinner4195b5c2012-02-08 23:03:19 +01001104}
1105
1106
Guido van Rossumb6775db1994-08-01 11:34:53 +00001107/* Implement floatsleep() for various platforms.
1108 When interrupted (or when another error occurs), return -1 and
1109 set an exception; else return 0. */
1110
1111static int
Guido van Rossuma320fd31995-03-09 12:14:15 +00001112floatsleep(double secs)
Guido van Rossum426035c1991-02-19 12:27:35 +00001113{
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001114/* XXX Should test for MS_WINDOWS first! */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +00001115#if defined(HAVE_SELECT) && !defined(__EMX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 struct timeval t;
1117 double frac;
Victor Stinner48b1ce52011-07-01 13:50:09 +02001118 int err;
1119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 frac = fmod(secs, 1.0);
1121 secs = floor(secs);
1122 t.tv_sec = (long)secs;
1123 t.tv_usec = (long)(frac*1000000.0);
1124 Py_BEGIN_ALLOW_THREADS
Victor Stinner48b1ce52011-07-01 13:50:09 +02001125 err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
1126 Py_END_ALLOW_THREADS
1127 if (err != 0) {
Guido van Rossum09cbb011999-11-08 15:32:27 +00001128#ifdef EINTR
Victor Stinner48b1ce52011-07-01 13:50:09 +02001129 if (errno == EINTR) {
1130 if (PyErr_CheckSignals())
1131 return -1;
1132 }
1133 else
Guido van Rossum09cbb011999-11-08 15:32:27 +00001134#endif
Victor Stinner48b1ce52011-07-01 13:50:09 +02001135 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 PyErr_SetFromErrno(PyExc_IOError);
1137 return -1;
1138 }
1139 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001140#elif defined(__WATCOMC__) && !defined(__QNX__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 /* XXX Can't interrupt this sleep */
1142 Py_BEGIN_ALLOW_THREADS
1143 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */
1144 Py_END_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001145#elif defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 {
1147 double millisecs = secs * 1000.0;
1148 unsigned long ul_millis;
Tim Peters513a1cd2003-01-19 04:54:58 +00001149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 if (millisecs > (double)ULONG_MAX) {
1151 PyErr_SetString(PyExc_OverflowError,
1152 "sleep length is too large");
1153 return -1;
1154 }
1155 Py_BEGIN_ALLOW_THREADS
1156 /* Allow sleep(0) to maintain win32 semantics, and as decreed
1157 * by Guido, only the main thread can be interrupted.
1158 */
1159 ul_millis = (unsigned long)millisecs;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001160 if (ul_millis == 0 || !_PyOS_IsMainThread())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 Sleep(ul_millis);
1162 else {
1163 DWORD rc;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001164 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 ResetEvent(hInterruptEvent);
1166 rc = WaitForSingleObject(hInterruptEvent, ul_millis);
1167 if (rc == WAIT_OBJECT_0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 Py_BLOCK_THREADS
1169 errno = EINTR;
1170 PyErr_SetFromErrno(PyExc_IOError);
1171 return -1;
1172 }
1173 }
1174 Py_END_ALLOW_THREADS
1175 }
Martin v. Löwis02af9642002-01-16 11:04:06 +00001176#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 /* This Sleep *IS* Interruptable by Exceptions */
1178 Py_BEGIN_ALLOW_THREADS
1179 if (DosSleep(secs * 1000) != NO_ERROR) {
1180 Py_BLOCK_THREADS
1181 PyErr_SetFromErrno(PyExc_IOError);
1182 return -1;
1183 }
1184 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 /* XXX Can't interrupt this sleep */
1187 Py_BEGIN_ALLOW_THREADS
1188 sleep((int)secs);
1189 Py_END_ALLOW_THREADS
Martin v. Löwis02af9642002-01-16 11:04:06 +00001190#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 return 0;
Guido van Rossum80c9d881991-04-16 08:47:51 +00001193}