From 3dbfcc52593d62d183ef4df93526deeac23ca4d4 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 28 May 2024 15:35:38 +0200 Subject: [PATCH 1/3] While datetime uses global state, only initialize it once --- Modules/_datetimemodule.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 271b37dfcded6c..0a6d3aaa795856 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -48,6 +48,9 @@ typedef struct { /* The interned Unix epoch datetime instance */ PyObject *epoch; + + /* While we use a global state, we ensure it's only initialized once */ + int initialized; } datetime_state; static datetime_state _datetime_global_state; @@ -6841,6 +6844,12 @@ create_timezone_from_delta(int days, int sec, int ms, int normalize) static int init_state(datetime_state *st) { + // While datetime uses global module "state", we unly initialize it once. + // The PyLong objects created here (once per process) are not decref'd. + if (st->initialized) { + return 0; + } + st->date_type = &PyDateTime_DateType; st->datetime_type = &PyDateTime_DateTimeType; st->delta_type = &PyDateTime_DeltaType; @@ -6893,6 +6902,9 @@ init_state(datetime_state *st) if (st->epoch == NULL) { return -1; } + + st->initialized = 1; + return 0; } From 2f7970de2275f8e3346f7d7b3253db4e23864668 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 28 May 2024 16:06:18 +0200 Subject: [PATCH 2/3] Do not free the static `capi` --- Modules/_datetimemodule.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 0a6d3aaa795856..e3a2b12e5e24f5 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -7017,12 +7017,8 @@ _datetime_exec(PyObject *module) goto error; } PyObject *capsule = PyCapsule_New(capi, PyDateTime_CAPSULE_NAME, NULL); - if (capsule == NULL) { - PyMem_Free(capi); - goto error; - } + // (capsule == NULL) {is handled by PyModule_Add if (PyModule_Add(module, "datetime_CAPI", capsule) < 0) { - PyMem_Free(capi); goto error; } From 29230781789ee225f7c3a2bb26e21bece96b6f2b Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 28 May 2024 19:05:11 +0200 Subject: [PATCH 3/3] typo --- Modules/_datetimemodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index e3a2b12e5e24f5..54383ca5177368 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -7017,7 +7017,7 @@ _datetime_exec(PyObject *module) goto error; } PyObject *capsule = PyCapsule_New(capi, PyDateTime_CAPSULE_NAME, NULL); - // (capsule == NULL) {is handled by PyModule_Add + // (capsule == NULL) is handled by PyModule_Add if (PyModule_Add(module, "datetime_CAPI", capsule) < 0) { goto error; }