diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2023-02-04 11:24:58 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-02-04 11:24:58 +0300 |
commit | 892a21b74980ab578f06429f1045c018558765c4 (patch) | |
tree | 6a3e0d8e6d32cf911b3ce6f1485d4ecf78bf9b00 /finalize.c | |
parent | 997f1636a877bd23067188141936ae5ea4e29b3d (diff) | |
download | bdwgc-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.c | 16 |
1 files changed, 7 insertions, 9 deletions
@@ -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); |