764 |
struct finalizable_object * curr_fo; |
struct finalizable_object * curr_fo; |
765 |
int count = 0; |
int count = 0; |
766 |
word mem_freed_before; |
word mem_freed_before; |
|
GC_bool first_time = TRUE; |
|
767 |
DCL_LOCK_STATE; |
DCL_LOCK_STATE; |
768 |
|
|
769 |
while (GC_finalize_now != 0) { |
while (GC_finalize_now != 0) { |
771 |
DISABLE_SIGNALS(); |
DISABLE_SIGNALS(); |
772 |
LOCK(); |
LOCK(); |
773 |
# endif |
# endif |
774 |
if (first_time) { |
if (count == 0) { |
775 |
mem_freed_before = GC_mem_freed; |
mem_freed_before = GC_mem_freed; |
|
first_time = FALSE; |
|
776 |
} |
} |
777 |
curr_fo = GC_finalize_now; |
curr_fo = GC_finalize_now; |
778 |
# ifdef THREADS |
# ifdef THREADS |
795 |
GC_free((GC_PTR)curr_fo); |
GC_free((GC_PTR)curr_fo); |
796 |
# endif |
# endif |
797 |
} |
} |
798 |
if (mem_freed_before != GC_mem_freed) { |
if (count != 0 && mem_freed_before != GC_mem_freed) { |
799 |
LOCK(); |
LOCK(); |
800 |
GC_finalizer_mem_freed += (GC_mem_freed - mem_freed_before); |
GC_finalizer_mem_freed += (GC_mem_freed - mem_freed_before); |
801 |
UNLOCK(); |
UNLOCK(); |