@@ -109,42 +109,21 @@ unlink_and_clear_object_lock_held(PyWeakReference *self)
109
109
}
110
110
}
111
111
112
- static void
112
+ static PyObject *
113
113
clear_callback_lock_held (PyWeakReference * self )
114
114
{
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 ;
140
118
}
141
119
142
120
// Clear the weakref while the world is stopped
143
121
static void
144
122
gc_clear_weakref (PyWeakReference * self )
145
123
{
146
124
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 );
148
127
}
149
128
150
129
static int
@@ -156,7 +135,7 @@ do_clear_weakref_and_leave_callback(PyWeakReference *self)
156
135
return 0 ;
157
136
}
158
137
159
- // Atomically clear the weakref, but leave the callback intact
138
+ // Clear the weakref, but leave the callback intact
160
139
static void
161
140
clear_weakref_and_leave_callback (PyWeakReference * self )
162
141
{
@@ -177,8 +156,7 @@ do_clear_weakref_and_take_callback(ClearArgs *args)
177
156
PyWeakReference * weakref = args -> weakref ;
178
157
Py_BEGIN_CRITICAL_SECTION2 (weakref -> wr_object , weakref );
179
158
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 );
182
160
Py_END_CRITICAL_SECTION2 ();
183
161
return 0 ;
184
162
}
@@ -198,6 +176,14 @@ clear_weakref_and_take_callback(PyWeakReference *self)
198
176
return args .callback ;
199
177
}
200
178
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
+
201
187
#else
202
188
203
189
/* This function clears the passed-in reference and removes it from the
0 commit comments