bpo-41568: Fix refleaks in zoneinfo subclasses (GH-21907)
* Fix refleak in C module __init_subclass__ This was leaking a reference to the weak cache dictionary for every ZoneInfo subclass created. * Fix refleak in ZoneInfo subclass's clear_cache The previous version of the code accidentally cleared the global ZONEINFO_STRONG_CACHE variable (and inducing `ZoneInfo` to create a new strong cache) on calls to a subclass's `clear_cache()`. This would not affect guaranteed behavior, but it's still not the right thing to do (and it caused reference leaks).
This commit is contained in:
parent
8aa163eea6
commit
c3dd7e45cc
|
@ -412,7 +412,6 @@ zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_strong_cache(type);
|
clear_strong_cache(type);
|
||||||
ZONEINFO_STRONG_CACHE = NULL;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PyObject *item = NULL;
|
PyObject *item = NULL;
|
||||||
|
@ -2471,6 +2470,7 @@ clear_strong_cache(const PyTypeObject *const type)
|
||||||
}
|
}
|
||||||
|
|
||||||
strong_cache_free(ZONEINFO_STRONG_CACHE);
|
strong_cache_free(ZONEINFO_STRONG_CACHE);
|
||||||
|
ZONEINFO_STRONG_CACHE = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -2525,6 +2525,7 @@ zoneinfo_init_subclass(PyTypeObject *cls, PyObject *args, PyObject **kwargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject_SetAttrString((PyObject *)cls, "_weak_cache", weak_cache);
|
PyObject_SetAttrString((PyObject *)cls, "_weak_cache", weak_cache);
|
||||||
|
Py_DECREF(weak_cache);
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2616,8 +2617,7 @@ module_free()
|
||||||
Py_CLEAR(ZONEINFO_WEAK_CACHE);
|
Py_CLEAR(ZONEINFO_WEAK_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
strong_cache_free(ZONEINFO_STRONG_CACHE);
|
clear_strong_cache(&PyZoneInfo_ZoneInfoType);
|
||||||
ZONEINFO_STRONG_CACHE = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue