aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/timemodule.c
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-02-12 07:53:52 +0300
committershadchin <shadchin@yandex-team.com>2024-02-12 08:07:36 +0300
commitce1b7ca3171f9158180640c6a02a74b4afffedea (patch)
treee47c1e8391b1b0128262c1e9b1e6ed4c8fff2348 /contrib/tools/python3/src/Modules/timemodule.c
parent57350d96f030db90f220ce50ee591d5c5d403df7 (diff)
downloadydb-ce1b7ca3171f9158180640c6a02a74b4afffedea.tar.gz
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Modules/timemodule.c')
-rw-r--r--contrib/tools/python3/src/Modules/timemodule.c141
1 files changed, 82 insertions, 59 deletions
diff --git a/contrib/tools/python3/src/Modules/timemodule.c b/contrib/tools/python3/src/Modules/timemodule.c
index b8e0e481cb..3b46deacdf 100644
--- a/contrib/tools/python3/src/Modules/timemodule.c
+++ b/contrib/tools/python3/src/Modules/timemodule.c
@@ -30,7 +30,9 @@
# include <i86.h>
#else
# ifdef MS_WINDOWS
-# define WIN32_LEAN_AND_MEAN
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
# include <windows.h>
# endif /* MS_WINDOWS */
#endif /* !__WATCOMC__ || __QNX__ */
@@ -62,6 +64,56 @@
#define SEC_TO_NS (1000 * 1000 * 1000)
+#if defined(HAVE_TIMES) || defined(HAVE_CLOCK)
+static int
+check_ticks_per_second(long tps, const char *context)
+{
+ /* Effectively, check that _PyTime_MulDiv(t, SEC_TO_NS, ticks_per_second)
+ cannot overflow. */
+ if (tps >= 0 && (_PyTime_t)tps > _PyTime_MAX / SEC_TO_NS) {
+ PyErr_Format(PyExc_OverflowError, "%s is too large", context);
+ return -1;
+ }
+ return 0;
+}
+#endif /* HAVE_TIMES || HAVE_CLOCK */
+
+#ifdef HAVE_TIMES
+
+# define ticks_per_second _PyRuntime.time.ticks_per_second
+
+static void
+ensure_ticks_per_second(void)
+{
+ if (_PyRuntime.time.ticks_per_second_initialized) {
+ return;
+ }
+ _PyRuntime.time.ticks_per_second_initialized = 1;
+# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
+ ticks_per_second = sysconf(_SC_CLK_TCK);
+ if (ticks_per_second < 1) {
+ ticks_per_second = -1;
+ }
+# elif defined(HZ)
+ ticks_per_second = HZ;
+# else
+ ticks_per_second = 60; /* magic fallback value; may be bogus */
+# endif
+}
+
+#endif /* HAVE_TIMES */
+
+
+PyStatus
+_PyTime_Init(void)
+{
+#ifdef HAVE_TIMES
+ ensure_ticks_per_second();
+#endif
+ return PyStatus_Ok();
+}
+
+
/* Forward declarations */
static int pysleep(_PyTime_t timeout);
@@ -140,18 +192,8 @@ Return the current time in nanoseconds since the Epoch.");
static int
_PyTime_GetClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
{
- static int initialized = 0;
-
- if (!initialized) {
- initialized = 1;
-
- /* Make sure that _PyTime_MulDiv(ticks, SEC_TO_NS, CLOCKS_PER_SEC)
- above cannot overflow */
- if ((_PyTime_t)CLOCKS_PER_SEC > _PyTime_MAX / SEC_TO_NS) {
- PyErr_SetString(PyExc_OverflowError,
- "CLOCKS_PER_SEC is too large");
- return -1;
- }
+ if (check_ticks_per_second(CLOCKS_PER_SEC, "CLOCKS_PER_SEC") < 0) {
+ return -1;
}
if (info) {
@@ -910,14 +952,9 @@ is not present, current time as returned by localtime() is used.\n\
static PyObject *
time_strptime(PyObject *self, PyObject *args)
{
- PyObject *module, *func, *result;
+ PyObject *func, *result;
- module = PyImport_ImportModule("_strptime");
- if (!module)
- return NULL;
-
- func = PyObject_GetAttr(module, &_Py_ID(_strptime_time));
- Py_DECREF(module);
+ func = _PyImport_GetModuleAttrString("_strptime", "_strptime_time");
if (!func) {
return NULL;
}
@@ -1100,7 +1137,9 @@ time_tzset(PyObject *self, PyObject *unused)
return NULL;
}
+#if !defined(MS_WINDOWS) || defined(MS_WINDOWS_DESKTOP) || defined(MS_WINDOWS_SYSTEM)
tzset();
+#endif
/* Reset timezone, altzone, daylight and tzname */
if (init_timezone(m) < 0) {
@@ -1313,36 +1352,10 @@ _PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
struct tms t;
if (times(&t) != (clock_t)-1) {
- static long ticks_per_second = -1;
-
- if (ticks_per_second == -1) {
- long freq;
-#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
- freq = sysconf(_SC_CLK_TCK);
- if (freq < 1) {
- freq = -1;
- }
-#elif defined(HZ)
- freq = HZ;
-#else
- freq = 60; /* magic fallback value; may be bogus */
-#endif
-
- if (freq != -1) {
- /* check that _PyTime_MulDiv(t, SEC_TO_NS, ticks_per_second)
- cannot overflow below */
-#if LONG_MAX > _PyTime_MAX / SEC_TO_NS
- if ((_PyTime_t)freq > _PyTime_MAX / SEC_TO_NS) {
- PyErr_SetString(PyExc_OverflowError,
- "_SC_CLK_TCK is too large");
- return -1;
- }
-#endif
-
- ticks_per_second = freq;
- }
+ assert(_PyRuntime.time.ticks_per_second_initialized);
+ if (check_ticks_per_second(ticks_per_second, "_SC_CLK_TCK") < 0) {
+ return -1;
}
-
if (ticks_per_second != -1) {
if (info) {
info->implementation = "times()";
@@ -1724,6 +1737,12 @@ get_gmtoff(time_t t, struct tm *p)
static int
init_timezone(PyObject *m)
{
+#define ADD_INT(NAME, VALUE) do { \
+ if (PyModule_AddIntConstant(m, NAME, VALUE) < 0) { \
+ return -1; \
+ } \
+} while (0)
+
assert(!PyErr_Occurred());
/* This code moved from PyInit_time wholesale to allow calling it from
@@ -1744,14 +1763,16 @@ init_timezone(PyObject *m)
*/
#ifdef HAVE_DECL_TZNAME
PyObject *otz0, *otz1;
+#if !defined(MS_WINDOWS) || defined(MS_WINDOWS_DESKTOP) || defined(MS_WINDOWS_SYSTEM)
tzset();
- PyModule_AddIntConstant(m, "timezone", _Py_timezone);
+#endif
+ ADD_INT("timezone", _Py_timezone);
#ifdef HAVE_ALTZONE
- PyModule_AddIntConstant(m, "altzone", altzone);
+ ADD_INT("altzone", altzone);
#else
- PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600);
+ ADD_INT("altzone", _Py_timezone-3600);
#endif
- PyModule_AddIntConstant(m, "daylight", _Py_daylight);
+ ADD_INT("daylight", _Py_daylight);
#ifdef MS_WINDOWS
TIME_ZONE_INFORMATION tzinfo = {0};
GetTimeZoneInformation(&tzinfo);
@@ -1810,20 +1831,21 @@ init_timezone(PyObject *m)
PyObject *tzname_obj;
if (janzone < julyzone) {
/* DST is reversed in the southern hemisphere */
- PyModule_AddIntConstant(m, "timezone", julyzone);
- PyModule_AddIntConstant(m, "altzone", janzone);
- PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
+ ADD_INT("timezone", julyzone);
+ ADD_INT("altzone", janzone);
+ ADD_INT("daylight", janzone != julyzone);
tzname_obj = Py_BuildValue("(zz)", julyname, janname);
} else {
- PyModule_AddIntConstant(m, "timezone", janzone);
- PyModule_AddIntConstant(m, "altzone", julyzone);
- PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
+ ADD_INT("timezone", janzone);
+ ADD_INT("altzone", julyzone);
+ ADD_INT("daylight", janzone != julyzone);
tzname_obj = Py_BuildValue("(zz)", janname, julyname);
}
if (_PyModule_Add(m, "tzname", tzname_obj) < 0) {
return -1;
}
#endif // !HAVE_DECL_TZNAME
+#undef ADD_INT
if (PyErr_Occurred()) {
return -1;
@@ -2089,6 +2111,7 @@ time_module_free(void *module)
static struct PyModuleDef_Slot time_slots[] = {
{Py_mod_exec, time_exec},
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
{0, NULL}
};