Skip to content

Commit

Permalink
pythongh-117398: pythongh-119655: datetime: Init static state once & …
Browse files Browse the repository at this point in the history
…don't free it (pythonGH-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)
  • Loading branch information
encukou authored and estyxx committed Jul 17, 2024
1 parent 2ca5185 commit f11e522
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions Modules/_datetimemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -6893,6 +6902,9 @@ init_state(datetime_state *st)
if (st->epoch == NULL) {
return -1;
}

st->initialized = 1;

return 0;
}

Expand Down Expand Up @@ -7005,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;
}

Expand Down

0 comments on commit f11e522

Please sign in to comment.