aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/object_stack.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-02-09 17:08:32 -0500
committerGitHub <noreply@github.com>2024-02-09 17:08:32 -0500
commita3af3cb4f424034b56404704fdf8f18e8c0a9982 (patch)
tree62ee00ea8725669a67c0fb9f7d8692fedf55bbae /Python/object_stack.c
parenta225520af941fb125a4ede77a617501dfb8b46da (diff)
downloadcpython-a3af3cb4f424034b56404704fdf8f18e8c0a9982.tar.gz
cpython-a3af3cb4f424034b56404704fdf8f18e8c0a9982.zip
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.
Diffstat (limited to 'Python/object_stack.c')
-rw-r--r--Python/object_stack.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Python/object_stack.c b/Python/object_stack.c
index 8544892eb71..ced4460da00 100644
--- a/Python/object_stack.c
+++ b/Python/object_stack.c
@@ -68,6 +68,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)
{
if (!is_finalization) {