]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Clean shred on exit
authorfennecdjay <fennecdjay@gmail.com>
Sun, 3 Jul 2022 19:51:37 +0000 (21:51 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sun, 3 Jul 2022 19:51:37 +0000 (21:51 +0200)
include/vm.h
src/lib/shred.c
src/vm/shreduler.c
src/vm/vm.c

index deca0f85ea7eb4a912cd6e113b286375312820f9..e57b036d8c3f30f02aa3ddc3956f7dc16192ed23 100644 (file)
@@ -131,7 +131,7 @@ ANN m_str code_name(const m_str, const bool);
 ANN uint32_t gw_rand(uint32_t s[2]);
 ANN void     gw_seed(uint32_t s[2], const uint64_t);
 ANN void     handle(VM_Shred shred, const m_str effect);
-
+ANN bool unwind(const VM_Shred shred, const Symbol effect, const m_uint size);
 
 #define BBQ_POS_MAX 16777216
 
index 0d3f5100dffa2b1ddd0caecc4782cf0776fe215b..7d5856806195e4a45e226fe9d7754c0bf3e45c1b 100644 (file)
@@ -58,7 +58,7 @@ ANN M_Object new_fork(const VM_Shred shred, const VM_Code code, const Type t) {
 static MFUN(gw_shred_exit) {
   const VM_Shred s = ME(o);
   if((m_int)s->tick->prev != -1)
-   shreduler_remove(s->tick->shreduler, s, true);
+    shreduler_remove(s->tick->shreduler, s, true);
 }
 
 static MFUN(vm_shred_id) {
index 9266ba83835f43f1997542e46a7ff30c85fd70c4..a849dd79622587e65b7311762574a6d1905e0fac 100644 (file)
@@ -40,15 +40,19 @@ ANN static inline void shreduler_child(const Vector v) {
 
 ANN static void shreduler_erase(const Shreduler          s,
                                 struct ShredTick_ *const tk) {
-  MUTEX_LOCK(tk->self->mutex);
+  const VM_Shred shred = tk->self;
+  const m_uint size =
+      shred->info->frame.ptr ? vector_size(&shred->info->frame) : 0;
+  unwind(shred, (Symbol)-1, size);
+  MUTEX_LOCK(shred->mutex);
   if (tk->parent) {
     MUTEX_LOCK(tk->parent->self->mutex);
     vector_rem2(&tk->parent->child, (vtype)tk->self);
     MUTEX_UNLOCK(tk->parent->self->mutex);
   }
   if (tk->child.ptr) shreduler_child(&tk->child);
-  vector_rem2(&s->active_shreds, (vtype)tk->self);
-  MUTEX_UNLOCK(tk->self->mutex);
+  vector_rem2(&s->active_shreds, (vtype)shred);
+  MUTEX_UNLOCK(shred->mutex);
 }
 
 ANN void shreduler_remove(const Shreduler s, const VM_Shred out,
index 52c550087fd24b62cd24ef51be01eea9d7508ae4..ef769d2b64ff972e49f5ccd5abda68285978cc48 100644 (file)
@@ -92,7 +92,7 @@ ANN static inline bool find_handle(const VM_Shred shred, const Symbol effect, co
   return true;
 }
 
-ANN static bool unwind(const VM_Shred shred, const Symbol effect, const m_uint size) {
+ANN bool unwind(const VM_Shred shred, const Symbol effect, const m_uint size) {
   const VM_Code code = shred->code;
   if (code->live_values.ptr)
     clean_values(shred);