]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve vm locks
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 2 Dec 2019 23:15:18 +0000 (00:15 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 2 Dec 2019 23:15:18 +0000 (00:15 +0100)
src/gwion.c
src/lib/shred.c
src/vm/vm.c

index 8589d67657077393bda80ed4beea0eec399e57a1..07937ae6e3ef584eb7691504c9e7304188e4246e 100644 (file)
@@ -120,12 +120,10 @@ ANN static void fork_clean2(const VM_Shred shred, const Vector v) {
 }
 
 ANN static void gwion_end_child(const VM_Shred shred, const Gwion gwion) {
-  MUTEX_LOCK(gwion->vm->shreduler->mutex);
   if(gwion->data->child.ptr)
     fork_clean(shred, &gwion->data->child);
   if(gwion->data->child2.ptr)
     fork_clean2(shred, &gwion->data->child2);
-  MUTEX_UNLOCK(gwion->vm->shreduler->mutex);
 }
 
 ANN void gwion_end(const Gwion gwion) {
index c1f3cfd9530c79a41476cc7e06fe44947caac603..7f974516f517fd769b3f057f948493bcf0bec330 100644 (file)
@@ -212,10 +212,6 @@ static ANN void* fork_run(void* data) {
 }
 
 ANN void fork_launch(const VM* vm, const M_Object o, const m_uint sz) {
-  o->ref += 1;
-  if(!vm->gwion->data->child.ptr)
-    vector_init(&vm->gwion->data->child);
-  vector_add(&vm->gwion->data->child, (vtype)o);
   FORK_RETSIZE(o) = sz;
   THREAD_CREATE(FORK_THREAD(o), fork_run, o);
 }
index d1d4368e22da013a797fe491344ad0a89f8aacaf..c3456ae8beeece1def606785eeabe053b64cfe4c 100644 (file)
@@ -68,12 +68,35 @@ ANN void vm_add_shred(const VM* vm, const VM_Shred shred) {
   shreduler_add(vm->shreduler, shred);
 }
 
-#include "gwion.h"
+ANN void vm_lock(VM *vm) {
+  do MUTEX_LOCK(vm->shreduler->mutex);
+  while((vm = vm->parent));
+}
+
+ANN void vm_unlock(VM *vm) {
+  do MUTEX_UNLOCK(vm->shreduler->mutex);
+  while((vm = vm->parent));
+}
+
+ANN m_bool vm_running(VM *vm) {
+  do if(!vm->shreduler->bbq->is_running) return 0;
+  while((vm = vm->parent));
+  return 1;
+}
+
 ANN static void vm_fork(VM* src, const VM_Shred shred) {
-  VM* vm = (shred->info->vm = gwion_cpy(src));
-  vm->parent = src;
-  shred->info->me = new_shred(shred, 0);
-  shreduler_add(vm->shreduler, shred);
+  vm_lock(src);
+  if(vm_running(src)) {
+    VM* vm = (shred->info->vm = gwion_cpy(src));
+    vm->parent = src;
+    const M_Object o = shred->info->me = new_shred(shred, 0);
+    ++shred->info->me->ref;
+    if(!src->gwion->data->child.ptr)
+      vector_init(&src->gwion->data->child);
+    vector_add(&src->gwion->data->child, (vtype)o);
+    shreduler_add(vm->shreduler, shred);
+  }
+  vm_unlock(src);
 }
 
 __attribute__((hot))