mirror of
https://github.com/python/cpython.git
synced 2025-08-02 08:02:56 +00:00
gh-117398: gh-119655: datetime: Init static state once & don't free it (GH-119662)
- While datetime uses global state, only initialize it once. - While `capi` is static, don't free it (thanks @neonene in https://github.com/python/cpython/pull/119641/files#r1616710048)
This commit is contained in:
parent
6ec371223d
commit
a89fc26f4a
1 changed files with 13 additions and 5 deletions
|
@ -48,6 +48,9 @@ typedef struct {
|
||||||
|
|
||||||
/* The interned Unix epoch datetime instance */
|
/* The interned Unix epoch datetime instance */
|
||||||
PyObject *epoch;
|
PyObject *epoch;
|
||||||
|
|
||||||
|
/* While we use a global state, we ensure it's only initialized once */
|
||||||
|
int initialized;
|
||||||
} datetime_state;
|
} datetime_state;
|
||||||
|
|
||||||
static datetime_state _datetime_global_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
|
static int
|
||||||
init_state(datetime_state *st)
|
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->date_type = &PyDateTime_DateType;
|
||||||
st->datetime_type = &PyDateTime_DateTimeType;
|
st->datetime_type = &PyDateTime_DateTimeType;
|
||||||
st->delta_type = &PyDateTime_DeltaType;
|
st->delta_type = &PyDateTime_DeltaType;
|
||||||
|
@ -6893,6 +6902,9 @@ init_state(datetime_state *st)
|
||||||
if (st->epoch == NULL) {
|
if (st->epoch == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
st->initialized = 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7005,12 +7017,8 @@ _datetime_exec(PyObject *module)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
PyObject *capsule = PyCapsule_New(capi, PyDateTime_CAPSULE_NAME, NULL);
|
PyObject *capsule = PyCapsule_New(capi, PyDateTime_CAPSULE_NAME, NULL);
|
||||||
if (capsule == NULL) {
|
// (capsule == NULL) is handled by PyModule_Add
|
||||||
PyMem_Free(capi);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (PyModule_Add(module, "datetime_CAPI", capsule) < 0) {
|
if (PyModule_Add(module, "datetime_CAPI", capsule) < 0) {
|
||||||
PyMem_Free(capi);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue