summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-02-04 11:24:58 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-02-04 11:24:58 +0300
commit892a21b74980ab578f06429f1045c018558765c4 (patch)
tree6a3e0d8e6d32cf911b3ce6f1485d4ecf78bf9b00 /finalize.c
parent997f1636a877bd23067188141936ae5ea4e29b3d (diff)
downloadbdwgc-892a21b74980ab578f06429f1045c018558765c4.tar.gz
Minimize THREADS-specific code in GC_invoke_finalizers
(refactoring) * finalize.c (GC_invoke_finalizers): Call LOCK() and UNLOCK() even if no THREADS. * finalize.c [THREADS] (GC_invoke_finalizers): Replace GC_fnlz_roots.finalize_now assignment to SET_FINALIZE_NOW() call.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/finalize.c b/finalize.c
index bc71a5b4..dc222668 100644
--- a/finalize.c
+++ b/finalize.c
@@ -1245,22 +1245,20 @@ GC_API int GC_CALL GC_invoke_finalizers(void)
while (GC_should_invoke_finalizers() && !GC_interrupt_finalizers) {
struct finalizable_object * curr_fo;
-# ifdef THREADS
- LOCK();
-# endif
+ LOCK();
if (count == 0) {
bytes_freed_before = GC_bytes_freed;
/* Don't do this outside, since we need the lock. */
}
curr_fo = GC_fnlz_roots.finalize_now;
# ifdef THREADS
- if (curr_fo != NULL)
- SET_FINALIZE_NOW(fo_next(curr_fo));
- UNLOCK();
- if (curr_fo == 0) break;
-# else
- GC_fnlz_roots.finalize_now = fo_next(curr_fo);
+ if (EXPECT(NULL == curr_fo, FALSE)) {
+ UNLOCK();
+ break;
+ }
# endif
+ SET_FINALIZE_NOW(fo_next(curr_fo));
+ UNLOCK();
fo_set_next(curr_fo, 0);
(*(curr_fo -> fo_fn))((ptr_t)(curr_fo -> fo_hidden_base),
curr_fo -> fo_client_data);