Changeset 391 for python/trunk/Modules/timemodule.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Modules/timemodule.c
r2 r391 47 47 static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType) 48 48 { 49 50 51 52 53 54 49 SetEvent(hInterruptEvent); 50 /* allow other default handlers to be called. 51 Default Python handler will setup the 52 KeyboardInterrupt exception. 53 */ 54 return FALSE; 55 55 } 56 56 static long main_thread; … … 97 97 98 98 /* For Y2K check */ 99 static PyObject *moddict ;99 static PyObject *moddict = NULL; 100 100 101 101 /* Exposed in timefuncs.h. */ … … 103 103 _PyTime_DoubleToTimet(double x) 104 104 { 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 105 time_t result; 106 double diff; 107 108 result = (time_t)x; 109 /* How much info did we lose? time_t may be an integral or 110 * floating type, and we don't know which. If it's integral, 111 * we don't know whether C truncates, rounds, returns the floor, 112 * etc. If we lost a second or more, the C rounding is 113 * unreasonable, or the input just doesn't fit in a time_t; 114 * call it an error regardless. Note that the original cast to 115 * time_t can cause a C error too, but nothing we can do to 116 * worm around that. 117 */ 118 diff = x - (double)result; 119 if (diff <= -1.0 || diff >= 1.0) { 120 PyErr_SetString(PyExc_ValueError, 121 "timestamp out of range for platform time_t"); 122 result = (time_t)-1; 123 } 124 return result; 125 125 } 126 126 … … 128 128 time_time(PyObject *self, PyObject *unused) 129 129 { 130 131 132 133 134 135 136 130 double secs; 131 secs = floattime(); 132 if (secs == 0.0) { 133 PyErr_SetFromErrno(PyExc_IOError); 134 return NULL; 135 } 136 return PyFloat_FromDouble(secs); 137 137 } 138 138 … … 156 156 time_clock(PyObject *self, PyObject *unused) 157 157 { 158 158 return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC); 159 159 } 160 160 #endif /* HAVE_CLOCK */ … … 165 165 time_clock(PyObject *self, PyObject *unused) 166 166 { 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 167 static LARGE_INTEGER ctrStart; 168 static double divisor = 0.0; 169 LARGE_INTEGER now; 170 double diff; 171 172 if (divisor == 0.0) { 173 LARGE_INTEGER freq; 174 QueryPerformanceCounter(&ctrStart); 175 if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { 176 /* Unlikely to happen - this works on all intel 177 machines at least! Revert to clock() */ 178 return PyFloat_FromDouble(((double)clock()) / 179 CLOCKS_PER_SEC); 180 } 181 divisor = (double)freq.QuadPart; 182 } 183 QueryPerformanceCounter(&now); 184 diff = (double)(now.QuadPart - ctrStart.QuadPart); 185 return PyFloat_FromDouble(diff / divisor); 186 186 } 187 187 … … 201 201 time_sleep(PyObject *self, PyObject *args) 202 202 { 203 204 205 206 207 208 209 203 double secs; 204 if (!PyArg_ParseTuple(args, "d:sleep", &secs)) 205 return NULL; 206 if (floatsleep(secs) != 0) 207 return NULL; 208 Py_INCREF(Py_None); 209 return Py_None; 210 210 } 211 211 … … 217 217 218 218 static PyStructSequence_Field struct_time_type_fields[] = { 219 {"tm_year", NULL},220 {"tm_mon", NULL},221 {"tm_mday", NULL},222 {"tm_hour", NULL},223 {"tm_min", NULL},224 {"tm_sec", NULL},225 {"tm_wday", NULL},226 {"tm_yday", NULL},227 {"tm_isdst", NULL},228 219 {"tm_year", "year, for example, 1993"}, 220 {"tm_mon", "month of year, range [1, 12]"}, 221 {"tm_mday", "day of month, range [1, 31]"}, 222 {"tm_hour", "hours, range [0, 23]"}, 223 {"tm_min", "minutes, range [0, 59]"}, 224 {"tm_sec", "seconds, range [0, 61])"}, 225 {"tm_wday", "day of week, range [0, 6], Monday is 0"}, 226 {"tm_yday", "day of year, range [1, 366]"}, 227 {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"}, 228 {0} 229 229 }; 230 230 231 231 static PyStructSequence_Desc struct_time_type_desc = { 232 "time.struct_time", 233 NULL, 234 struct_time_type_fields, 235 9, 232 "time.struct_time", 233 "The time value as returned by gmtime(), localtime(), and strptime(), and\n" 234 " accepted by asctime(), mktime() and strftime(). May be considered as a\n" 235 " sequence of 9 integers.\n\n" 236 " Note that several fields' values are not the same as those defined by\n" 237 " the C language standard for struct tm. For example, the value of the\n" 238 " field tm_year is the actual year, not year - 1900. See individual\n" 239 " fields' descriptions for details.", 240 struct_time_type_fields, 241 9, 236 242 }; 237 243 … … 242 248 tmtotuple(struct tm *p) 243 249 { 244 245 246 250 PyObject *v = PyStructSequence_New(&StructTimeType); 251 if (v == NULL) 252 return NULL; 247 253 248 254 #define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val)) 249 255 250 251 SET(1, p->tm_mon + 1);/* Want January == 1 */252 253 254 255 256 257 SET(7, p->tm_yday + 1);/* Want January, 1 == 1 */258 256 SET(0, p->tm_year + 1900); 257 SET(1, p->tm_mon + 1); /* Want January == 1 */ 258 SET(2, p->tm_mday); 259 SET(3, p->tm_hour); 260 SET(4, p->tm_min); 261 SET(5, p->tm_sec); 262 SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */ 263 SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */ 264 SET(8, p->tm_isdst); 259 265 #undef SET 260 261 262 263 264 265 266 if (PyErr_Occurred()) { 267 Py_XDECREF(v); 268 return NULL; 269 } 270 271 return v; 266 272 } 267 273 … … 269 275 time_convert(double when, struct tm * (*function)(const time_t *)) 270 276 { 271 272 273 274 275 276 277 278 277 struct tm *p; 278 time_t whent = _PyTime_DoubleToTimet(when); 279 280 if (whent == (time_t)-1 && PyErr_Occurred()) 281 return NULL; 282 errno = 0; 283 p = function(&whent); 284 if (p == NULL) { 279 285 #ifdef EINVAL 280 281 282 #endif 283 284 285 286 if (errno == 0) 287 errno = EINVAL; 288 #endif 289 return PyErr_SetFromErrno(PyExc_ValueError); 290 } 291 return tmtotuple(p); 286 292 } 287 293 … … 293 299 parse_time_double_args(PyObject *args, char *format, double *pwhen) 294 300 { 295 296 297 298 299 300 301 302 303 304 305 306 307 301 PyObject *ot = NULL; 302 303 if (!PyArg_ParseTuple(args, format, &ot)) 304 return 0; 305 if (ot == NULL || ot == Py_None) 306 *pwhen = floattime(); 307 else { 308 double when = PyFloat_AsDouble(ot); 309 if (PyErr_Occurred()) 310 return 0; 311 *pwhen = when; 312 } 313 return 1; 308 314 } 309 315 … … 311 317 time_gmtime(PyObject *self, PyObject *args) 312 318 { 313 314 315 316 319 double when; 320 if (!parse_time_double_args(args, "|O:gmtime", &when)) 321 return NULL; 322 return time_convert(when, gmtime); 317 323 } 318 324 … … 327 333 time_localtime(PyObject *self, PyObject *args) 328 334 { 329 330 331 332 335 double when; 336 if (!parse_time_double_args(args, "|O:localtime", &when)) 337 return NULL; 338 return time_convert(when, localtime); 333 339 } 334 340 335 341 PyDoc_STRVAR(localtime_doc, 336 342 "localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\ 337 343 tm_sec,tm_wday,tm_yday,tm_isdst)\n\ 338 344 \n\ 339 345 Convert seconds since the Epoch to a time tuple expressing local time.\n\ … … 343 349 gettmarg(PyObject *args, struct tm *p) 344 350 { 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 351 int y; 352 memset((void *) p, '\0', sizeof(struct tm)); 353 354 if (!PyArg_Parse(args, "(iiiiiiiii)", 355 &y, 356 &p->tm_mon, 357 &p->tm_mday, 358 &p->tm_hour, 359 &p->tm_min, 360 &p->tm_sec, 361 &p->tm_wday, 362 &p->tm_yday, 363 &p->tm_isdst)) 364 return 0; 365 if (y < 1900) { 366 PyObject *accept = PyDict_GetItemString(moddict, 367 "accept2dyear"); 368 if (accept == NULL || !PyInt_Check(accept) || 369 PyInt_AsLong(accept) == 0) { 370 PyErr_SetString(PyExc_ValueError, 371 "year >= 1900 required"); 372 return 0; 373 } 374 if (69 <= y && y <= 99) 375 y += 1900; 376 else if (0 <= y && y <= 68) 377 y += 2000; 378 else { 379 PyErr_SetString(PyExc_ValueError, 380 "year out of range"); 381 return 0; 382 } 383 } 384 p->tm_year = y - 1900; 385 p->tm_mon--; 386 p->tm_wday = (p->tm_wday + 1) % 7; 387 p->tm_yday--; 388 return 1; 383 389 } 384 390 … … 387 393 time_strftime(PyObject *self, PyObject *args) 388 394 { 389 PyObject *tup = NULL; 390 struct tm buf; 391 const char *fmt; 392 size_t fmtlen, buflen; 393 char *outbuf = 0; 394 size_t i; 395 396 memset((void *) &buf, '\0', sizeof(buf)); 397 398 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup)) 399 return NULL; 400 401 if (tup == NULL) { 402 time_t tt = time(NULL); 403 buf = *localtime(&tt); 404 } else if (!gettmarg(tup, &buf)) 405 return NULL; 406 407 /* Checks added to make sure strftime() does not crash Python by 408 indexing blindly into some array for a textual representation 409 by some bad index (fixes bug #897625). 410 411 Also support values of zero from Python code for arguments in which 412 that is out of range by forcing that value to the lowest value that 413 is valid (fixed bug #1520914). 414 415 Valid ranges based on what is allowed in struct tm: 416 417 - tm_year: [0, max(int)] (1) 418 - tm_mon: [0, 11] (2) 419 - tm_mday: [1, 31] 420 - tm_hour: [0, 23] 421 - tm_min: [0, 59] 422 - tm_sec: [0, 60] 423 - tm_wday: [0, 6] (1) 424 - tm_yday: [0, 365] (2) 425 - tm_isdst: [-max(int), max(int)] 426 427 (1) gettmarg() handles bounds-checking. 428 (2) Python's acceptable range is one greater than the range in C, 429 thus need to check against automatic decrement by gettmarg(). 430 */ 431 if (buf.tm_mon == -1) 432 buf.tm_mon = 0; 433 else if (buf.tm_mon < 0 || buf.tm_mon > 11) { 434 PyErr_SetString(PyExc_ValueError, "month out of range"); 435 return NULL; 436 } 437 if (buf.tm_mday == 0) 438 buf.tm_mday = 1; 439 else if (buf.tm_mday < 0 || buf.tm_mday > 31) { 440 PyErr_SetString(PyExc_ValueError, "day of month out of range"); 441 return NULL; 442 } 443 if (buf.tm_hour < 0 || buf.tm_hour > 23) { 444 PyErr_SetString(PyExc_ValueError, "hour out of range"); 395 PyObject *tup = NULL; 396 struct tm buf; 397 const char *fmt; 398 size_t fmtlen, buflen; 399 char *outbuf = 0; 400 size_t i; 401 402 memset((void *) &buf, '\0', sizeof(buf)); 403 404 if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup)) 405 return NULL; 406 407 if (tup == NULL) { 408 time_t tt = time(NULL); 409 buf = *localtime(&tt); 410 } else if (!gettmarg(tup, &buf)) 411 return NULL; 412 413 /* Checks added to make sure strftime() does not crash Python by 414 indexing blindly into some array for a textual representation 415 by some bad index (fixes bug #897625). 416 417 Also support values of zero from Python code for arguments in which 418 that is out of range by forcing that value to the lowest value that 419 is valid (fixed bug #1520914). 420 421 Valid ranges based on what is allowed in struct tm: 422 423 - tm_year: [0, max(int)] (1) 424 - tm_mon: [0, 11] (2) 425 - tm_mday: [1, 31] 426 - tm_hour: [0, 23] 427 - tm_min: [0, 59] 428 - tm_sec: [0, 60] 429 - tm_wday: [0, 6] (1) 430 - tm_yday: [0, 365] (2) 431 - tm_isdst: [-max(int), max(int)] 432 433 (1) gettmarg() handles bounds-checking. 434 (2) Python's acceptable range is one greater than the range in C, 435 thus need to check against automatic decrement by gettmarg(). 436 */ 437 if (buf.tm_mon == -1) 438 buf.tm_mon = 0; 439 else if (buf.tm_mon < 0 || buf.tm_mon > 11) { 440 PyErr_SetString(PyExc_ValueError, "month out of range"); 445 441 return NULL; 446 } 447 if (buf.tm_min < 0 || buf.tm_min > 59) { 448 PyErr_SetString(PyExc_ValueError, "minute out of range"); 442 } 443 if (buf.tm_mday == 0) 444 buf.tm_mday = 1; 445 else if (buf.tm_mday < 0 || buf.tm_mday > 31) { 446 PyErr_SetString(PyExc_ValueError, "day of month out of range"); 449 447 return NULL; 450 } 451 if (buf.tm_sec < 0 || buf.tm_sec > 61) { 452 PyErr_SetString(PyExc_ValueError, "seconds out of range"); 453 return NULL; 454 } 455 /* tm_wday does not need checking of its upper-bound since taking 456 ``% 7`` in gettmarg() automatically restricts the range. */ 457 if (buf.tm_wday < 0) { 458 PyErr_SetString(PyExc_ValueError, "day of week out of range"); 459 return NULL; 460 } 461 if (buf.tm_yday == -1) 462 buf.tm_yday = 0; 463 else if (buf.tm_yday < 0 || buf.tm_yday > 365) { 464 PyErr_SetString(PyExc_ValueError, "day of year out of range"); 465 return NULL; 466 } 467 if (buf.tm_isdst < -1 || buf.tm_isdst > 1) { 468 PyErr_SetString(PyExc_ValueError, 469 "daylight savings flag out of range"); 470 return NULL; 471 } 472 473 fmtlen = strlen(fmt); 474 475 /* I hate these functions that presume you know how big the output 476 * will be ahead of time... 477 */ 478 for (i = 1024; ; i += i) { 479 outbuf = (char *)malloc(i); 480 if (outbuf == NULL) { 481 return PyErr_NoMemory(); 482 } 483 buflen = strftime(outbuf, i, fmt, &buf); 484 if (buflen > 0 || i >= 256 * fmtlen) { 485 /* If the buffer is 256 times as long as the format, 486 it's probably not failing for lack of room! 487 More likely, the format yields an empty result, 488 e.g. an empty format, or %Z when the timezone 489 is unknown. */ 490 PyObject *ret; 491 ret = PyString_FromStringAndSize(outbuf, buflen); 492 free(outbuf); 493 return ret; 494 } 495 free(outbuf); 448 } 449 if (buf.tm_hour < 0 || buf.tm_hour > 23) { 450 PyErr_SetString(PyExc_ValueError, "hour out of range"); 451 return NULL; 452 } 453 if (buf.tm_min < 0 || buf.tm_min > 59) { 454 PyErr_SetString(PyExc_ValueError, "minute out of range"); 455 return NULL; 456 } 457 if (buf.tm_sec < 0 || buf.tm_sec > 61) { 458 PyErr_SetString(PyExc_ValueError, "seconds out of range"); 459 return NULL; 460 } 461 /* tm_wday does not need checking of its upper-bound since taking 462 ``% 7`` in gettmarg() automatically restricts the range. */ 463 if (buf.tm_wday < 0) { 464 PyErr_SetString(PyExc_ValueError, "day of week out of range"); 465 return NULL; 466 } 467 if (buf.tm_yday == -1) 468 buf.tm_yday = 0; 469 else if (buf.tm_yday < 0 || buf.tm_yday > 365) { 470 PyErr_SetString(PyExc_ValueError, "day of year out of range"); 471 return NULL; 472 } 473 /* Normalize tm_isdst just in case someone foolishly implements %Z 474 based on the assumption that tm_isdst falls within the range of 475 [-1, 1] */ 476 if (buf.tm_isdst < -1) 477 buf.tm_isdst = -1; 478 else if (buf.tm_isdst > 1) 479 buf.tm_isdst = 1; 480 481 #ifdef MS_WINDOWS 482 /* check that the format string contains only valid directives */ 483 for(outbuf = strchr(fmt, '%'); 484 outbuf != NULL; 485 outbuf = strchr(outbuf+2, '%')) 486 { 487 if (outbuf[1]=='#') 488 ++outbuf; /* not documented by python, */ 489 if (outbuf[1]=='\0' || 490 !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) 491 { 492 PyErr_SetString(PyExc_ValueError, "Invalid format string"); 493 return 0; 494 } 495 } 496 #endif 497 498 fmtlen = strlen(fmt); 499 500 /* I hate these functions that presume you know how big the output 501 * will be ahead of time... 502 */ 503 for (i = 1024; ; i += i) { 504 outbuf = (char *)malloc(i); 505 if (outbuf == NULL) { 506 return PyErr_NoMemory(); 507 } 508 buflen = strftime(outbuf, i, fmt, &buf); 509 if (buflen > 0 || i >= 256 * fmtlen) { 510 /* If the buffer is 256 times as long as the format, 511 it's probably not failing for lack of room! 512 More likely, the format yields an empty result, 513 e.g. an empty format, or %Z when the timezone 514 is unknown. */ 515 PyObject *ret; 516 ret = PyString_FromStringAndSize(outbuf, buflen); 517 free(outbuf); 518 return ret; 519 } 520 free(outbuf); 496 521 #if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) 497 498 499 500 501 502 #endif 503 504 522 /* VisualStudio .NET 2005 does this properly */ 523 if (buflen == 0 && errno == EINVAL) { 524 PyErr_SetString(PyExc_ValueError, "Invalid format string"); 525 return 0; 526 } 527 #endif 528 529 } 505 530 } 506 531 … … 521 546 if (!strptime_module) 522 547 return NULL; 523 strptime_result = PyObject_CallMethod(strptime_module, "_strptime_time", "O", args); 548 strptime_result = PyObject_CallMethod(strptime_module, 549 "_strptime_time", "O", args); 524 550 Py_DECREF(strptime_module); 525 551 return strptime_result; … … 536 562 time_asctime(PyObject *self, PyObject *args) 537 563 { 538 PyObject *tup = NULL; 539 struct tm buf; 540 char *p; 541 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup)) 542 return NULL; 543 if (tup == NULL) { 544 time_t tt = time(NULL); 545 buf = *localtime(&tt); 546 } else if (!gettmarg(tup, &buf)) 547 return NULL; 548 p = asctime(&buf); 549 if (p[24] == '\n') 550 p[24] = '\0'; 551 return PyString_FromString(p); 564 PyObject *tup = NULL; 565 struct tm buf; 566 char *p; 567 if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup)) 568 return NULL; 569 if (tup == NULL) { 570 time_t tt = time(NULL); 571 buf = *localtime(&tt); 572 } else if (!gettmarg(tup, &buf)) 573 return NULL; 574 p = asctime(&buf); 575 if (p == NULL) { 576 PyErr_SetString(PyExc_ValueError, "invalid time"); 577 return NULL; 578 } 579 if (p[24] == '\n') 580 p[24] = '\0'; 581 return PyString_FromString(p); 552 582 } 553 583 … … 562 592 time_ctime(PyObject *self, PyObject *args) 563 593 { 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 594 PyObject *ot = NULL; 595 time_t tt; 596 char *p; 597 598 if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot)) 599 return NULL; 600 if (ot == NULL || ot == Py_None) 601 tt = time(NULL); 602 else { 603 double dt = PyFloat_AsDouble(ot); 604 if (PyErr_Occurred()) 605 return NULL; 606 tt = _PyTime_DoubleToTimet(dt); 607 if (tt == (time_t)-1 && PyErr_Occurred()) 608 return NULL; 609 } 610 p = ctime(&tt); 611 if (p == NULL) { 612 PyErr_SetString(PyExc_ValueError, "unconvertible time"); 613 return NULL; 614 } 615 if (p[24] == '\n') 616 p[24] = '\0'; 617 return PyString_FromString(p); 588 618 } 589 619 … … 599 629 time_mktime(PyObject *self, PyObject *tup) 600 630 { 601 struct tm buf; 602 time_t tt; 603 if (!gettmarg(tup, &buf)) 604 return NULL; 605 tt = mktime(&buf); 606 if (tt == (time_t)(-1)) { 607 PyErr_SetString(PyExc_OverflowError, 608 "mktime argument out of range"); 609 return NULL; 610 } 611 return PyFloat_FromDouble((double)tt); 631 struct tm buf; 632 time_t tt; 633 if (!gettmarg(tup, &buf)) 634 return NULL; 635 buf.tm_wday = -1; /* sentinel; original value ignored */ 636 tt = mktime(&buf); 637 /* Return value of -1 does not necessarily mean an error, but tm_wday 638 * cannot remain set to -1 if mktime succeeded. */ 639 if (tt == (time_t)(-1) && buf.tm_wday == -1) { 640 PyErr_SetString(PyExc_OverflowError, 641 "mktime argument out of range"); 642 return NULL; 643 } 644 return PyFloat_FromDouble((double)tt); 612 645 } 613 646 … … 624 657 time_tzset(PyObject *self, PyObject *unused) 625 658 { 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 659 PyObject* m; 660 661 m = PyImport_ImportModuleNoBlock("time"); 662 if (m == NULL) { 663 return NULL; 664 } 665 666 tzset(); 667 668 /* Reset timezone, altzone, daylight and tzname */ 669 inittimezone(m); 670 Py_DECREF(m); 671 672 Py_INCREF(Py_None); 673 return Py_None; 641 674 } 642 675 643 676 PyDoc_STRVAR(tzset_doc, 644 "tzset( zone)\n\677 "tzset()\n\ 645 678 \n\ 646 679 Initialize, or reinitialize, the local timezone to the value stored in\n\ … … 658 691 inittimezone(PyObject *m) { 659 692 /* This code moved from inittime wholesale to allow calling it from 660 661 662 663 664 665 666 667 668 669 670 671 672 673 693 time_tzset. In the future, some parts of it can be moved back 694 (for platforms that don't HAVE_WORKING_TZSET, when we know what they 695 are), and the extraneous calls to tzset(3) should be removed. 696 I haven't done this yet, as I don't want to change this code as 697 little as possible when introducing the time.tzset and time.tzsetwall 698 methods. This should simply be a method of doing the following once, 699 at the top of this function and removing the call to tzset() from 700 time_tzset(): 701 702 #ifdef HAVE_TZSET 703 tzset() 704 #endif 705 706 And I'm lazy and hate C so nyer. 674 707 */ 675 708 #if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__) 676 709 tzset(); 677 710 #ifdef PYOS_OS2 678 711 PyModule_AddIntConstant(m, "timezone", _timezone); 679 712 #else /* !PYOS_OS2 */ 680 713 PyModule_AddIntConstant(m, "timezone", timezone); 681 714 #endif /* PYOS_OS2 */ 682 715 #ifdef HAVE_ALTZONE 683 716 PyModule_AddIntConstant(m, "altzone", altzone); 684 717 #else 685 718 #ifdef PYOS_OS2 686 719 PyModule_AddIntConstant(m, "altzone", _timezone-3600); 687 720 #else /* !PYOS_OS2 */ 688 721 PyModule_AddIntConstant(m, "altzone", timezone-3600); 689 722 #endif /* PYOS_OS2 */ 690 723 #endif 691 692 693 724 PyModule_AddIntConstant(m, "daylight", daylight); 725 PyModule_AddObject(m, "tzname", 726 Py_BuildValue("(zz)", tzname[0], tzname[1])); 694 727 #else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ 695 728 #ifdef HAVE_STRUCT_TM_TM_ZONE 696 729 { 697 730 #define YEAR ((time_t)((365 * 24 + 6) * 3600)) 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 731 time_t t; 732 struct tm *p; 733 long janzone, julyzone; 734 char janname[10], julyname[10]; 735 t = (time((time_t *)0) / YEAR) * YEAR; 736 p = localtime(&t); 737 janzone = -p->tm_gmtoff; 738 strncpy(janname, p->tm_zone ? p->tm_zone : " ", 9); 739 janname[9] = '\0'; 740 t += YEAR/2; 741 p = localtime(&t); 742 julyzone = -p->tm_gmtoff; 743 strncpy(julyname, p->tm_zone ? p->tm_zone : " ", 9); 744 julyname[9] = '\0'; 745 746 if( janzone < julyzone ) { 747 /* DST is reversed in the southern hemisphere */ 748 PyModule_AddIntConstant(m, "timezone", julyzone); 749 PyModule_AddIntConstant(m, "altzone", janzone); 750 PyModule_AddIntConstant(m, "daylight", 751 janzone != julyzone); 752 PyModule_AddObject(m, "tzname", 753 Py_BuildValue("(zz)", 754 julyname, janname)); 755 } else { 756 PyModule_AddIntConstant(m, "timezone", janzone); 757 PyModule_AddIntConstant(m, "altzone", julyzone); 758 PyModule_AddIntConstant(m, "daylight", 759 janzone != julyzone); 760 PyModule_AddObject(m, "tzname", 761 Py_BuildValue("(zz)", 762 janname, julyname)); 763 } 764 } 732 765 #else 733 766 #endif /* HAVE_STRUCT_TM_TM_ZONE */ 734 767 #ifdef __CYGWIN__ 735 736 737 738 739 740 768 tzset(); 769 PyModule_AddIntConstant(m, "timezone", _timezone); 770 PyModule_AddIntConstant(m, "altzone", _timezone-3600); 771 PyModule_AddIntConstant(m, "daylight", _daylight); 772 PyModule_AddObject(m, "tzname", 773 Py_BuildValue("(zz)", _tzname[0], _tzname[1])); 741 774 #endif /* __CYGWIN__ */ 742 775 #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ … … 745 778 746 779 static PyMethodDef time_methods[] = { 747 {"time",time_time, METH_NOARGS, time_doc},780 {"time", time_time, METH_NOARGS, time_doc}, 748 781 #ifdef HAVE_CLOCK 749 {"clock",time_clock, METH_NOARGS, clock_doc},750 #endif 751 {"sleep",time_sleep, METH_VARARGS, sleep_doc},752 {"gmtime",time_gmtime, METH_VARARGS, gmtime_doc},753 {"localtime",time_localtime, METH_VARARGS, localtime_doc},754 {"asctime",time_asctime, METH_VARARGS, asctime_doc},755 {"ctime",time_ctime, METH_VARARGS, ctime_doc},782 {"clock", time_clock, METH_NOARGS, clock_doc}, 783 #endif 784 {"sleep", time_sleep, METH_VARARGS, sleep_doc}, 785 {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc}, 786 {"localtime", time_localtime, METH_VARARGS, localtime_doc}, 787 {"asctime", time_asctime, METH_VARARGS, asctime_doc}, 788 {"ctime", time_ctime, METH_VARARGS, ctime_doc}, 756 789 #ifdef HAVE_MKTIME 757 {"mktime",time_mktime, METH_O, mktime_doc},790 {"mktime", time_mktime, METH_O, mktime_doc}, 758 791 #endif 759 792 #ifdef HAVE_STRFTIME 760 {"strftime",time_strftime, METH_VARARGS, strftime_doc},761 #endif 762 {"strptime",time_strptime, METH_VARARGS, strptime_doc},793 {"strftime", time_strftime, METH_VARARGS, strftime_doc}, 794 #endif 795 {"strptime", time_strptime, METH_VARARGS, strptime_doc}, 763 796 #ifdef HAVE_WORKING_TZSET 764 {"tzset",time_tzset, METH_NOARGS, tzset_doc},765 #endif 766 {NULL, NULL}/* sentinel */797 {"tzset", time_tzset, METH_NOARGS, tzset_doc}, 798 #endif 799 {NULL, NULL} /* sentinel */ 767 800 }; 768 801 … … 817 850 inittime(void) 818 851 { 819 PyObject *m; 820 char *p; 821 m = Py_InitModule3("time", time_methods, module_doc); 822 if (m == NULL) 823 return; 824 825 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */ 826 p = Py_GETENV("PYTHONY2K"); 827 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p)); 828 /* Squirrel away the module's dictionary for the y2k check */ 829 moddict = PyModule_GetDict(m); 830 Py_INCREF(moddict); 831 832 /* Set, or reset, module variables like time.timezone */ 833 inittimezone(m); 852 PyObject *m; 853 char *p; 854 m = Py_InitModule3("time", time_methods, module_doc); 855 if (m == NULL) 856 return; 857 858 /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */ 859 p = Py_GETENV("PYTHONY2K"); 860 PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p)); 861 /* If an embedded interpreter is shutdown and reinitialized the old 862 moddict was not decrefed on shutdown and the next import of this 863 module leads to a leak. Conditionally decref here to prevent that. 864 */ 865 Py_XDECREF(moddict); 866 /* Squirrel away the module's dictionary for the y2k check */ 867 moddict = PyModule_GetDict(m); 868 Py_INCREF(moddict); 869 870 /* Set, or reset, module variables like time.timezone */ 871 inittimezone(m); 834 872 835 873 #ifdef MS_WINDOWS 836 837 838 839 840 841 842 874 /* Helper to allow interrupts for Windows. 875 If Ctrl+C event delivered while not sleeping 876 it will be ignored. 877 */ 878 main_thread = PyThread_get_thread_ident(); 879 hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 880 SetConsoleCtrlHandler( PyCtrlHandler, TRUE); 843 881 #endif /* MS_WINDOWS */ 844 845 846 847 848 849 850 882 if (!initialized) { 883 PyStructSequence_InitType(&StructTimeType, 884 &struct_time_type_desc); 885 } 886 Py_INCREF(&StructTimeType); 887 PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); 888 initialized = 1; 851 889 } 852 890 … … 857 895 floattime(void) 858 896 { 859 860 861 862 863 864 865 866 897 /* There are three ways to get the time: 898 (1) gettimeofday() -- resolution in microseconds 899 (2) ftime() -- resolution in milliseconds 900 (3) time() -- resolution in seconds 901 In all cases the return value is a float in seconds. 902 Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may 903 fail, so we fall back on ftime() or time(). 904 Note: clock resolution does not imply clock accuracy! */ 867 905 #ifdef HAVE_GETTIMEOFDAY 868 869 906 { 907 struct timeval t; 870 908 #ifdef GETTIMEOFDAY_NO_TZ 871 872 909 if (gettimeofday(&t) == 0) 910 return (double)t.tv_sec + t.tv_usec*0.000001; 873 911 #else /* !GETTIMEOFDAY_NO_TZ */ 874 875 912 if (gettimeofday(&t, (struct timezone *)NULL) == 0) 913 return (double)t.tv_sec + t.tv_usec*0.000001; 876 914 #endif /* !GETTIMEOFDAY_NO_TZ */ 877 915 } 878 916 879 917 #endif /* !HAVE_GETTIMEOFDAY */ 880 918 { 881 919 #if defined(HAVE_FTIME) 882 883 884 920 struct timeb t; 921 ftime(&t); 922 return (double)t.time + (double)t.millitm * (double)0.001; 885 923 #else /* !HAVE_FTIME */ 886 887 888 924 time_t secs; 925 time(&secs); 926 return (double)secs; 889 927 #endif /* !HAVE_FTIME */ 890 928 } 891 929 } 892 930 … … 901 939 /* XXX Should test for MS_WINDOWS first! */ 902 940 #if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__) 903 904 905 906 907 908 909 910 941 struct timeval t; 942 double frac; 943 frac = fmod(secs, 1.0); 944 secs = floor(secs); 945 t.tv_sec = (long)secs; 946 t.tv_usec = (long)(frac*1000000.0); 947 Py_BEGIN_ALLOW_THREADS 948 if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) { 911 949 #ifdef EINTR 912 950 if (errno != EINTR) { 913 951 #else 914 915 #endif 916 917 918 919 920 921 952 if (1) { 953 #endif 954 Py_BLOCK_THREADS 955 PyErr_SetFromErrno(PyExc_IOError); 956 return -1; 957 } 958 } 959 Py_END_ALLOW_THREADS 922 960 #elif defined(__WATCOMC__) && !defined(__QNX__) 923 924 925 926 961 /* XXX Can't interrupt this sleep */ 962 Py_BEGIN_ALLOW_THREADS 963 delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */ 964 Py_END_ALLOW_THREADS 927 965 #elif defined(MS_WINDOWS) 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 966 { 967 double millisecs = secs * 1000.0; 968 unsigned long ul_millis; 969 970 if (millisecs > (double)ULONG_MAX) { 971 PyErr_SetString(PyExc_OverflowError, 972 "sleep length is too large"); 973 return -1; 974 } 975 Py_BEGIN_ALLOW_THREADS 976 /* Allow sleep(0) to maintain win32 semantics, and as decreed 977 * by Guido, only the main thread can be interrupted. 978 */ 979 ul_millis = (unsigned long)millisecs; 980 if (ul_millis == 0 || 981 main_thread != PyThread_get_thread_ident()) 982 Sleep(ul_millis); 983 else { 984 DWORD rc; 985 ResetEvent(hInterruptEvent); 986 rc = WaitForSingleObject(hInterruptEvent, ul_millis); 987 if (rc == WAIT_OBJECT_0) { 988 /* Yield to make sure real Python signal 989 * handler called. 990 */ 991 Sleep(1); 992 Py_BLOCK_THREADS 993 errno = EINTR; 994 PyErr_SetFromErrno(PyExc_IOError); 995 return -1; 996 } 997 } 998 Py_END_ALLOW_THREADS 999 } 962 1000 #elif defined(PYOS_OS2) 963 964 965 966 967 968 969 970 1001 /* This Sleep *IS* Interruptable by Exceptions */ 1002 Py_BEGIN_ALLOW_THREADS 1003 if (DosSleep(secs * 1000) != NO_ERROR) { 1004 Py_BLOCK_THREADS 1005 PyErr_SetFromErrno(PyExc_IOError); 1006 return -1; 1007 } 1008 Py_END_ALLOW_THREADS 971 1009 #elif defined(__BEOS__) 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 1010 /* This sleep *CAN BE* interrupted. */ 1011 { 1012 if( secs <= 0.0 ) { 1013 return; 1014 } 1015 1016 Py_BEGIN_ALLOW_THREADS 1017 /* BeOS snooze() is in microseconds... */ 1018 if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) { 1019 Py_BLOCK_THREADS 1020 PyErr_SetFromErrno( PyExc_IOError ); 1021 return -1; 1022 } 1023 Py_END_ALLOW_THREADS 1024 } 987 1025 #elif defined(RISCOS) 988 989 990 991 992 993 994 1026 if (secs <= 0.0) 1027 return 0; 1028 Py_BEGIN_ALLOW_THREADS 1029 /* This sleep *CAN BE* interrupted. */ 1030 if ( riscos_sleep(secs) ) 1031 return -1; 1032 Py_END_ALLOW_THREADS 995 1033 #elif defined(PLAN9) 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1034 { 1035 double millisecs = secs * 1000.0; 1036 if (millisecs > (double)LONG_MAX) { 1037 PyErr_SetString(PyExc_OverflowError, "sleep length is too large"); 1038 return -1; 1039 } 1040 /* This sleep *CAN BE* interrupted. */ 1041 Py_BEGIN_ALLOW_THREADS 1042 if(sleep((long)millisecs) < 0){ 1043 Py_BLOCK_THREADS 1044 PyErr_SetFromErrno(PyExc_IOError); 1045 return -1; 1046 } 1047 Py_END_ALLOW_THREADS 1048 } 1011 1049 #else 1012 /* XXX Can't interrupt this sleep */ 1013 Py_BEGIN_ALLOW_THREADS 1014 sleep((int)secs); 1015 Py_END_ALLOW_THREADS 1016 #endif 1017 1018 return 0; 1019 } 1020 1021 1050 /* XXX Can't interrupt this sleep */ 1051 Py_BEGIN_ALLOW_THREADS 1052 sleep((int)secs); 1053 Py_END_ALLOW_THREADS 1054 #endif 1055 1056 return 0; 1057 } 1058 1059 /* export floattime to socketmodule.c */ 1060 PyAPI_FUNC(double) 1061 _PyTime_FloatTime(void) 1062 { 1063 return floattime(); 1064 }
Note:
See TracChangeset
for help on using the changeset viewer.