Skip to content

MemoryError freelist is not thread-safe in free threaded build #129668

Closed
@colesbury

Description

@colesbury

Bug report

The MemoryError freelist isn't thread-safe if the GIL is disabled:

cpython/Objects/exceptions.c

Lines 3850 to 3860 in 285c1c4

/* 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

Metadata

Metadata

Assignees

Labels

3.13bugs and security fixes3.14new features, bugs and security fixestopic-free-threadingtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions