8000 Refactor clearing code · python/cpython@817a5a3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 817a5a3

Browse files
committed
Refactor clearing code
1 parent 19a274e commit 817a5a3

File tree

1 file changed

+16
-30
lines changed

1 file changed

+16
-30
lines changed

Objects/weakrefobject.c

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -109,42 +109,21 @@ unlink_and_clear_object_lock_held(PyWeakReference *self)
109109
}
110110
}
111111

112-
static void
112+
static PyObject *
113113
clear_callback_lock_held(PyWeakReference *self)
114114
{
115-
if (self->wr_callback != NULL) {
116-
PyObject *callback = self->wr_callback;
117-
self->wr_callback = NULL;
118-
Py_DECREF(callback);
119-
}
120-
}
121-
122-
static int
123-
do_clear_weakref(PyWeakReference *self)
124-
{
125-
Py_BEGIN_CRITICAL_SECTION2(self->wr_object, self);
126-
unlink_and_clear_object_lock_held(self);
127-
clear_callback_lock_held(self);
128-
Py_END_CRITICAL_SECTION2();
129-
return 0;
130-
}
131-
132-
// Atomically clear the weakref
133-
static void
134-
clear_weakref(PyWeakReference *self)
135-
{
136-
_PyOnceFlagRC *once = self->clear_once;
137-
_PyOnceFlagRC_Incref(once);
138-
_PyOnceFlag_CallOnce(&once->flag, (_Py_once_fn_t *) do_clear_weakref, self);
139-
_PyOnceFlagRC_Decref(once);
115+
PyObject *callback = self->wr_callback;
116+
self->wr_callback = NULL;
117+
return callback;
140118
}
141119

142120
// Clear the weakref while the world is stopped
143121
static void
144122
gc_clear_weakref(PyWeakReference *self)
145123
{
146124
unlink_and_clear_object_lock_held(self);
147-
clear_callback_lock_held(self);
125+
PyObject *callback = clear_callback_lock_held(self);
126+
Py_XDECREF(callback);
148127
}
149128

150129
static int
@@ -156,7 +135,7 @@ do_clear_weakref_and_leave_callback(PyWeakReference *self)
156135
return 0;
157136
}
158137

159-
// Atomically clear the weakref, but leave the callback intact
138+
// Clear the weakref, but leave the callback intact
160139
static void
161140
clear_weakref_and_leave_callback(PyWeakReference *self)
162141
{
@@ -177,8 +156,7 @@ do_clear_weakref_and_take_callback(ClearArgs *args)
177156
PyWeakReference *weakref = args->weakref;
178157
Py_BEGIN_CRITICAL_SECTION2(weakref->wr_object, weakref);
179158
unlink_and_clear_object_lock_held(weakref);
180-
args->callback = weakref->wr_callback;
181-
weakref->wr_callback = NULL;
159+
args->callback = clear_callback_lock_held(args->weakref);
182160
Py_END_CRITICAL_SECTION2();
183161
return 0;
184162
}
@@ -198,6 +176,14 @@ clear_weakref_and_take_callback(PyWeakReference *self)
198176
return args.callback;
199177
}
200178

179+
// Clear the weakref and its callback
180+
static void
181+
clear_weakref(PyWeakReference *self)
182+
{
183+
PyObject *callback = clear_weakref_and_take_callback(self);
184+
Py_XDECREF(callback);
185+
}
186+
201187
#else
202188

203189
/* This function clears the passed-in reference and removes it from the

0 commit comments

Comments
 (0)
0