shithub: sl

Download patch

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 = &notype;
 }
@@ -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;