Bug report
The MemoryError freelist isn't thread-safe if the GIL is disabled:
|
/* Fetch object from freelist and revive it */ |
|
self = state->memerrors_freelist; |
|
self->args = PyTuple_New(0); |
|
/* This shouldn't happen since the empty tuple is persistent */ |
|
|
|
if (self->args == NULL) { |
|
return NULL; |
|
} |
|
|
|
state->memerrors_freelist = (PyBaseExceptionObject *) self->dict; |
|
state->memerrors_numfree--; |
Most of the freelists were made thread-safe by making them per-thread in the free threaded build (using pycore_freelist.h), but we don't want to do that for MemoryError because its freelist serves a different purpose (it's not really for performance). I think we should just use a lock for MemoryError's freelist.
Linked PRs
Bug report
The
MemoryErrorfreelist isn't thread-safe if the GIL is disabled:cpython/Objects/exceptions.c
Lines 3850 to 3860 in 285c1c4
Most of the freelists were made thread-safe by making them per-thread in the free threaded build (using
pycore_freelist.h), but we don't want to do that forMemoryErrorbecause its freelist serves a different purpose (it's not really for performance). I think we should just use a lock forMemoryError's freelist.Linked PRs