colesbury · GitHub

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

Read the original on github.com ↗