ref: ae9998e6063d7ee3d2cdc95c45236f26515c0e7f
parent: c3e7f845c40f501ea112d2aa3f1764c51d254922
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Apr 24 04:09:56 EDT 2025
exit: sweep cvalues directly (skipping finalizers chain)
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -15,7 +15,7 @@
#define owned(cv) ((uintptr)(cv)->type & CV_OWNED)
#define isinlined(cv) ((cv)->data == (cv)->_space)
-static sl_type notype = {0};
+sl_type notype = {0};
sl_type *unboxedtypes[T_UNBOXED_NUM];
sl_v unboxedtypesyms[T_UNBOXED_NUM];
@@ -32,7 +32,7 @@
slg.finalizers[slg.nfinalizers++] = cv;
}
-static void
+void
sweep_cv(sl_cv *cv)
{
sl_type *t = cv_class(cv);
@@ -40,7 +40,6 @@
t->vtable->finalize(tagptr(cv, TAG_CVALUE));
if(!isinlined(cv) && owned(cv)){
MEM_FREE(cv_data(cv));
- cv_data(cv) = nil;
}
cv->type = ¬ype;
}
@@ -47,7 +46,7 @@
// remove dead objects from finalization list in-place
void
-sweep_finalizers(bool all)
+sweep_finalizers(void)
{
sl_cv **lst = slg.finalizers;
usize n = 0, ndel = 0, l = slg.nfinalizers;
@@ -57,18 +56,13 @@
return;
do{
tmp = lst[n];
- bool live = false;
if(isforwarded((sl_v)tmp)){
// object is alive
- tmp = ptr(forwardloc((sl_v)tmp));
- live = true;
- }
- if(!live || all){
+ lst[n] = ptr(forwardloc((sl_v)tmp));
+ n++;
+ }else{
sweep_cv(tmp);
ndel++;
- }else{
- lst[n] = tmp;
- n++;
}
}while((n < l-ndel) && SWAP_sf(lst[n], lst[n+ndel]));
@@ -722,8 +716,6 @@
if(t->vtable != nil && t->vtable->relocate != nil)
t->vtable->relocate(v, ncv);
forward(v, ncv);
- if(slg.exiting && t->vtable != nil)
- add_finalizer(ptr(ncv));
return ncv;
}
--- a/src/cvalues.h
+++ b/src/cvalues.h
@@ -1,8 +1,9 @@
#pragma once
void add_finalizer(sl_cv *cv);
-void sweep_finalizers(bool all);
+void sweep_finalizers(void);
void cv_autorelease(sl_cv *cv);
+void sweep_cv(sl_cv *cv);
sl_v cvalue_(sl_type *type, usize sz, bool nofinalizer);
#define cvalue(type, sz) cvalue_(type, sz, false)
#define cvalue_nofinalizer(type, sz) cvalue_(type, sz, true)
--- a/src/htable.c
+++ b/src/htable.c
@@ -48,7 +48,6 @@
{
if(h->table != &h->_space[0])
MEM_FREE(h->table);
- h->table = nil;
}
// empty and reduce size
--- a/src/sl.c
+++ b/src/sl.c
@@ -441,8 +441,13 @@
if(isforwarded(v))
return forwardloc(v);
- if(t == TAG_CVALUE)
+ if(t == TAG_CVALUE){
+ if(sl_unlikely(slg.exiting)){
+ sweep_cv(ptr(v));
+ return sl_nil;
+ }
return cvalue_relocate(v);
+ }
if(t == TAG_VEC){
// N.B.: 0-length vectors secretly have space for a first element
usize i, sz = vec_size(v);
@@ -556,7 +561,7 @@
sl_emptyvec = sl_relocate(sl_emptyvec);
sl_emptystr = sl_relocate(sl_emptystr);
- sweep_finalizers(slg.exiting);
+ sweep_finalizers();
void *temp = slg.tospace;
slg.tospace = slg.fromspace;