]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve shreduler
authorfennecdjay <fennecdjay@gmail.com>
Tue, 12 Jul 2022 19:25:09 +0000 (21:25 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Tue, 12 Jul 2022 19:25:09 +0000 (21:25 +0200)
src/compile.c
src/lib/shred.c
src/vm/shreduler.c

index 2974fdef081ac0de3d1a59a259bb3c7c20eb5593..c9b3ad9ed76868b4fa114d1c37c6243aff139d2d 100644 (file)
@@ -7,6 +7,7 @@
 #include "compile.h"
 #include "gwion.h"
 #include "pass.h"
+#include "shreduler_private.h"
 
 enum compile_type { COMPILE_NAME, COMPILE_MSTR, COMPILE_FILE };
 
@@ -178,6 +179,7 @@ ANN m_uint compile_string_xid(struct Gwion_ *gwion, const m_str filename,
   struct Compiler c = {.base = filename, .type = COMPILE_MSTR, .data = data};
   if (!compile(gwion, &c)) return 0;
   assert(c.shred);
+  gwion->vm->shreduler->shred_ids--;
   return c.shred->tick->xid = xid;
 }
 
index 7d5856806195e4a45e226fe9d7754c0bf3e45c1b..e7d518425abc5c644926d299d0e5f6f046464f75 100644 (file)
@@ -50,7 +50,6 @@ ANN M_Object new_fork(const VM_Shred shred, const VM_Code code, const Type t) {
   vm->parent            = parent;
   const M_Object o = sh->info->me = fork_object(shred, t);
   ME(o)                           = sh;
-//  ++o->ref;
   shreduler_add(vm->shreduler, sh);
   return o;
 }
index a849dd79622587e65b7311762574a6d1905e0fac..7e558b7829a4bc2cf43c9383d748f9128e21b6cf 100644 (file)
@@ -17,7 +17,7 @@ ANN VM_Shred shreduler_get(const Shreduler s) {
   Driver *const            bbq = s->bbq;
   struct ShredTick_ *const tk  = s->list;
   if (tk) {
-    const m_float time = (m_float)bbq->pos + (m_float)GWION_EPSILON;
+    const m_float time = (m_float)bbq->pos + GWION_EPSILON;
     if (tk->wake_time <= time) {
       if ((s->list = tk->next)) s->list->prev = NULL;
       tk->next = tk->prev = NULL;
@@ -31,45 +31,46 @@ ANN VM_Shred shreduler_get(const Shreduler s) {
   return NULL;
 }
 
-ANN static inline void shreduler_child(const Vector v) {
+ANN static void shreduler_erase(const Shreduler, struct ShredTick_ *const);
+
+ANN static void tk_remove(const Shreduler s, struct ShredTick_ *const tk) {
+  if (tk == s->curr) s->curr = NULL;
+  else if (tk == s->list) s->list = tk->next;
+  if (tk->prev) tk->prev->next = tk->next;
+  if (tk->next) tk->next->prev = tk->prev;
+}
+
+ANN static inline void child(const Shreduler s, const Vector v) {
   for (m_uint i = vector_size(v) + 1; --i;) {
     const VM_Shred child = (VM_Shred)vector_at(v, i - 1);
-    shreduler_remove(child->tick->shreduler, child, true);
+    struct ShredTick_ *const tk = child->tick;
+    tk_remove(s, tk);
+    shreduler_erase(s, tk);
   }
 }
 
 ANN static void shreduler_erase(const Shreduler          s,
                                 struct ShredTick_ *const tk) {
   const VM_Shred shred = tk->self;
+  if (tk->child.ptr) child(s, &tk->child);
+  MUTEX_LOCK(shred->mutex);
+  tk->prev = (struct ShredTick_*)-1;
+  MUTEX_UNLOCK(shred->mutex);
   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)shred);
-  MUTEX_UNLOCK(shred->mutex);
 }
 
 ANN void shreduler_remove(const Shreduler s, const VM_Shred out,
                           const bool erase) {
   MUTEX_LOCK(s->mutex);
   struct ShredTick_ *const tk = out->tick;
-  if (tk == s->curr)
-    s->curr = NULL;
-  else if (tk == s->list)
-    s->list = tk->next;
-  if (tk->prev) tk->prev->next = tk->next;
-  if (tk->next) tk->next->prev = tk->prev;
-  if (!erase)
-    tk->prev = tk->next = NULL;
+  tk_remove(s, tk);
+  if (likely(!erase)) tk->prev = tk->next = NULL;
   else {
     shreduler_erase(s, tk);
-    tk->prev = (struct ShredTick_*)-1;
+    if (tk->parent) vector_rem2(&tk->parent->child, (vtype)out);
     release(out->info->me, out);
   }
   MUTEX_UNLOCK(s->mutex);