gh-110481: Implement inter-thread queue for biased reference counting (#114824)

Biased reference counting maintains two refcount fields in each object:
`ob_ref_local` and `ob_ref_shared`. The true refcount is the sum of these two
fields. In some cases, when refcounting operations are split across threads,
the ob_ref_shared field can be negative (although the total refcount must be
at least zero). In this case, the thread that decremented the refcount
requests that the owning thread give up ownership and merge the refcount
fields.
This commit is contained in:
Sam Gross 2024-02-09 17:08:32 -05:00 committed by GitHub
parent a225520af9
commit a3af3cb4f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 418 additions and 11 deletions

View file

@ -67,6 +67,27 @@ _PyObjectStack_Clear(_PyObjectStack *queue)
}
}
void
_PyObjectStack_Merge(_PyObjectStack *dst, _PyObjectStack *src)
{
if (src->head == NULL) {
return;
}
if (dst->head != NULL) {
// First, append dst to the bottom of src
_PyObjectStackChunk *last = src->head;
while (last->prev != NULL) {
last = last->prev;
}
last->prev = dst->head;
}
// Now that src has all the chunks, set dst to src
dst->head = src->head;
src->head = NULL;
}
void
_PyObjectStackChunk_ClearFreeList(_PyFreeListState *free_lists, int is_finalization)
{