diff options
author | Michael Felt <aixtools@users.noreply.github.com> | 2018-12-28 13:57:37 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2018-12-28 13:57:37 (GMT) |
commit | e2926b72488596f59e43c27f3b7cedf0c5b9e88e (patch) | |
tree | dc8a3af47e822ffc6573726decb9c8dd75e6af7a /Modules/timemodule.c | |
parent | c465682718f15cd3deb6b37db5fb607718ac64ed (diff) | |
download | cpython-e2926b72488596f59e43c27f3b7cedf0c5b9e88e.zip cpython-e2926b72488596f59e43c27f3b7cedf0c5b9e88e.tar.gz cpython-e2926b72488596f59e43c27f3b7cedf0c5b9e88e.tar.bz2 |
bpo-34373: fix test_mktime and test_pthread_getcpuclickid tests on AIX (GH-8726)
* Fix test_mktime on AIX by adding code to get mktime to behave the
same way as it does on other *nix systems
* Fix test_pthread_getcpuclickid in AIX by adjusting the test case
expectations when running on AIX in 32-bit mode
Patch by Michael Felt.
Diffstat (limited to 'Modules/timemodule.c')
-rw-r--r-- | Modules/timemodule.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 01bb430..cf65229 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -174,10 +174,15 @@ static PyObject * time_clock_gettime(PyObject *self, PyObject *args) { int ret; - int clk_id; struct timespec tp; +#if defined(_AIX) && (SIZEOF_LONG == 8) + long clk_id; + if (!PyArg_ParseTuple(args, "l:clock_gettime", &clk_id)) { +#else + int clk_id; if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) { +#endif return NULL; } @@ -972,35 +977,51 @@ time_mktime(PyObject *self, PyObject *tup) { struct tm buf; time_t tt; +#ifdef _AIX + time_t clk; + int year = buf.tm_year; + int delta_days = 0; +#endif + if (!gettmarg(tup, &buf, "iiiiiiiii;mktime(): illegal time tuple argument")) { return NULL; } -#ifdef _AIX +#ifndef _AIX + buf.tm_wday = -1; /* sentinel; original value ignored */ + tt = mktime(&buf); +#else /* year < 1902 or year > 2037 */ - if (buf.tm_year < 2 || buf.tm_year > 137) { + if ((buf.tm_year < 2) || (buf.tm_year > 137)) { /* Issue #19748: On AIX, mktime() doesn't report overflow error for * timestamp < -2^31 or timestamp > 2**31-1. */ PyErr_SetString(PyExc_OverflowError, "mktime argument out of range"); return NULL; } -#else - buf.tm_wday = -1; /* sentinel; original value ignored */ + year = buf.tm_year; + /* year < 1970 - adjust buf.tm_year into legal range */ + while (buf.tm_year < 70) { + buf.tm_year += 4; + delta_days -= (366 + (365 * 3)); + } + + buf.tm_wday = -1; + clk = mktime(&buf); + buf.tm_year = year; + + if ((buf.tm_wday != -1) && delta_days) + buf.tm_wday = (buf.tm_wday + delta_days) % 7; + + tt = clk + (delta_days * (24 * 3600)); #endif - tt = mktime(&buf); /* Return value of -1 does not necessarily mean an error, but tm_wday * cannot remain set to -1 if mktime succeeded. */ if (tt == (time_t)(-1) -#ifndef _AIX /* Return value of -1 does not necessarily mean an error, but * tm_wday cannot remain set to -1 if mktime succeeded. */ - && buf.tm_wday == -1 -#else - /* on AIX, tm_wday is always sets, even on error */ -#endif - ) + && buf.tm_wday == -1) { PyErr_SetString(PyExc_OverflowError, "mktime argument out of range"); |