]> Nishi Git Mirror - gwion.git/commitdiff
:art: ReEnable Forks
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 8 Oct 2019 21:08:56 +0000 (23:08 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 8 Oct 2019 21:08:56 +0000 (23:08 +0200)
include/gwiondata.h
src/emit/emit.c
src/lib/shred.c
src/vm/vm.c

index c21a27ac5cc52f712add1e968f1e241ba4065b1d..742e1c99e90306ab46bed40e0439db7166553f6a 100644 (file)
@@ -8,6 +8,7 @@ typedef struct GwionData_ {
   struct Vector_ reserved;
   struct Map_ pass_map;
   struct Vector_ pass;
+  struct Gwion_ *base;
 } GwionData;
 
 ANN GwionData* new_gwiondata(MemPool);
index 9d2aaf15400d2017c72756887bb77c5f3c02ac02..085c6dc49d7cf7ab6899bf3eaa30482f9e310700 100644 (file)
@@ -1077,8 +1077,6 @@ if(is_spork) {
 } else {
     const Instr spork = emit_add_instr(emit, is_spork ? SporkExp : ForkEnd);
     spork->m_val = exp_self(unary)->emit_var;
-    if(!(spork->m_val = exp_self(unary)->emit_var))
-return NULL;// err_msg
 }
   } else {
     if(GET_FLAG(f, member) && is_fptr(emit->gwion, f->value_ref->type)) {
@@ -1090,8 +1088,6 @@ return NULL;// err_msg
     } else
       emit_exp_spork_finish(emit, f->def->stack_depth);
     const Instr end = emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);
-    if(!is_spork && !(end->m_val = exp_self(unary)->emit_var))
-      return NULL;// err_msg
     end->m_val2 = f->def->base->ret_type->size;
   }
   return ini;
index ab08d86a81090635a46b88f77955ee5fb8416461..41aeed37486bf1154149de47184b53b800df68ee 100644 (file)
@@ -153,6 +153,8 @@ static MFUN(shred_unlock) {
 }
 
 static DTOR(fork_dtor) {
+  if(*(m_int*)(o->data + o_fork_done))
+    vector_rem2(&FORK_ORIG(o)->gwion->data->child, (vtype)o);
   THREAD_JOIN(FORK_THREAD(o));
   VM *vm = ME(o)->info->vm;
   free_vm(vm);
@@ -201,9 +203,6 @@ static ANN void* fork_run(void* data) {
   } while(vm->bbq->is_running);
   fork_retval(me);
   MUTEX_LOCK(vm->shreduler->mutex);
-//  MUTEX_LOCK(FORK_ORIG(me)->shreduler->mutex);
-  vector_rem2(&FORK_ORIG(me)->gwion->data->child, (vtype)me);
-//  MUTEX_UNLOCK(FORK_ORIG(me)->shreduler->mutex);
   *(m_int*)(me->data + o_fork_done) = 1;
   broadcast(*(M_Object*)(me->data + o_fork_ev));
   MUTEX_UNLOCK(vm->shreduler->mutex);
@@ -220,7 +219,7 @@ ANN void fork_clean(const VM *vm, const Vector v) {
 }
 
 void fork_launch(const VM* vm, const M_Object o, const m_uint sz) {
-  o->ref += 2;
+  o->ref += 1;
   if(!vm->gwion->data->child.ptr)
     vector_init(&vm->gwion->data->child);
   vector_add(&vm->gwion->data->child, (vtype)o);
index 75a9f40f5b21143b48921b5c96af6bb54b690d2d..51742e90a0a1f12d084fc8aba0819ffd1f902d54 100644 (file)
@@ -78,9 +78,10 @@ ANN void vm_add_shred(const VM* vm, const VM_Shred shred) {
 
 #include "gwion.h"
 ANN void vm_fork(const VM* src, const VM_Shred shred) {
-  VM* vm = shred->info->vm = gwion_cpy(src);
+  VM* vm = (shred->info->vm = gwion_cpy(src));
   shred->info->me = new_shred(shred, 0);
   shreduler_add(vm->shreduler, shred);
+  vm->gwion->data->base = src->gwion;
 }
 
 __attribute__((hot))
@@ -128,8 +129,6 @@ ANN static inline VM_Shred init_spork_shred(const VM_Shred shred, const VM_Code
 ANN static inline VM_Shred init_fork_shred(const VM_Shred shred, const VM_Code code) {
   const VM_Shred sh = new_shred_base(shred, code);
   vm_fork(shred->info->vm, sh);
-  assert(sh->info->me);
-  vector_add(&shred->gc, (vtype)sh->info->me);
   return sh;
 }