]> Nishi Git Mirror - gwion.git/commitdiff
:art: More on Forking
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 5 Apr 2019 19:28:49 +0000 (21:28 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 5 Apr 2019 19:28:49 +0000 (21:28 +0200)
examples/fork.gw [new file with mode: 0644]
include/driver.h
include/object.h
src/emit/emit.c
src/gwion.c
src/lib/object.c
src/lib/shred.c
src/vm/shreduler.c
src/vm/vm.c
tests/import/global_var.c
tests/import/static_string.c

diff --git a/examples/fork.gw b/examples/fork.gw
new file mode 100644 (file)
index 0000000..0f5ced0
--- /dev/null
@@ -0,0 +1,11 @@
+fork {
+  <<<"start">>>;
+  12::samp => now;
+  me.test_cancel();
+  <<<"stop">>>;
+} @=> Fork @f;
+
+1 => f.cancel;
+2::samp => now;
+0 => f.cancel;
+f.join();
index 52160345e06be2d398046aa0d39c4f4fc7530d53..e3264f4b5bdb8f2afe2a1d7498e27f38d328dab9 100644 (file)
@@ -12,15 +12,9 @@ typedef struct DriverData_ {
   f_drvdel del;
 } DriverData;
 
-/*
-struct SoundInfo_ {
-  uint32_t sr;
-  uint8_t in, out;
-  m_str arg;
-};
-*/
 typedef void (*f_bbqset)(struct DriverData_*);
 typedef void (*f_bbqrun)(const struct VM_*);
+
 typedef struct BBQ_ {
   uint64_t pos;
   m_float* in;
index b21fcd22cb53a62d9200fbcc062df00472a9fc80..c1af5678ce8364ce4c36a4d3bbcc0f4bbb391bcb 100644 (file)
@@ -17,6 +17,7 @@ ANEW M_Object new_M_UGen(MemPool);
 ANN ANEW M_Object new_array(MemPool, const Type t, const m_uint length);
 ANEW M_Object new_string(MemPool, const VM_Shred, const m_str);
 ANEW M_Object new_string2(MemPool, const VM_Shred, const m_str);
+ANEW M_Object gwion_new_string(const struct Gwion_*, const m_str);
 ANEW M_Object new_shred(const VM_Shred, const m_bool);
 ANN void fork_launch(const M_Object, const m_uint);
 ANN void __release(const M_Object, const VM_Shred);
index acd352dc298042bec0234e8479ed283b785bc1d1..b4fbfe5136223695a0c17983b01cece7db40233a 100644 (file)
@@ -889,14 +889,7 @@ static void push_spork_code(const Emitter emit, const m_str prefix, const int po
 ANN static m_bool spork_func(const Emitter emit, const Exp_Call* exp) { GWDEBUG_EXE
   if(GET_FLAG(exp->m_func, member))
     SET_FLAG(emit->code, member);
-  if(exp->m_func->code) {
-    const Instr p = emit_add_instr(emit, RegPushImm);
-    p->m_val = (m_uint)exp->m_func->code;
-  } else {
-    const Instr p = emit_add_instr(emit, PushStaticCode);
-    p->m_val = (m_uint)exp->m_func;
-  }
-  return emit_exp_call1(emit, exp->m_func);
+  return emit_exp_call(emit, exp);
 }
 
 ANN m_bool emit_exp_spork(const Emitter emit, const Exp_Unary* unary) {
@@ -919,7 +912,7 @@ ANN m_bool emit_exp_spork(const Emitter emit, const Exp_Unary* unary) {
   if(unary->code) {
     const Instr spork = emit_add_instr(emit, is_spork ? SporkExp : ForkEnd);
     spork->m_val = emit->code->stack_depth;
-    emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);
+//    emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);
   } else {
     const Func f = unary->exp->d.exp_call.m_func;
     const m_uint size = f->def->stack_depth - (GET_FLAG(f, member) ? SZ_INT : 0);
index 13fe101d61ca66b1e75205c471b162a20b4d2364..009954b24adab54f7bb88383446f85406bf78c69 100644 (file)
@@ -52,11 +52,12 @@ ANN static inline void gwion_compile(const Gwion gwion, const Vector v) {
     compile_filename(gwion, (m_str)vector_at(v, i));
 }
 
-
+#include "shreduler_private.h"
 ANN VM* gwion_cpy(const VM* src) {
   const Gwion gwion = mp_alloc(src->gwion->p, Gwion);
   gwion->vm = new_vm(src->gwion->p);
   gwion->vm->gwion = gwion;
+//gwion->vm->shreduler->bbq->is_running = 1;
   gwion->vm->bbq->si = soundinfo_cpy(src->gwion->p, src->bbq->si);
   gwion->emit = src->gwion->emit;
   gwion->env = src->gwion->env;
@@ -69,6 +70,7 @@ ANN m_bool gwion_ini(const Gwion gwion, Arg* arg) {
   gwion->p = mempool_ini((sizeof(VM_Shred) + SIZEOF_REG + SIZEOF_MEM) / SZ_INT);
   gwion->st = new_symbol_table(gwion->p, 65347);
   gwion->vm = new_vm(gwion->p);
+printf("non fork vm: %p\n", gwion->vm->shreduler);
   gwion->emit = new_emitter();
   gwion->env = new_env(gwion->p);
   gwion->emit->env = gwion->env;
index 44214a81dad673225866debb43b1dd125070b007..3d1bc2dc8a9eef9ad6e4dbeb6e8b2ce4e3506a64 100644 (file)
@@ -49,8 +49,13 @@ M_Object new_string2(MemPool p, const VM_Shred shred, const m_str str) {
   return o;
 }
 
+M_Object gwion_new_string(const struct Gwion_ *gwion, const m_str str) {
+  const M_Object o = new_object(gwion->p, NULL, t_string);
+  STRING(o) = s_name(insert_symbol(gwion->st, str));
+  return o;
+}
+
 ANN void instantiate_object(const VM_Shred shred, const Type type) {
-//  const M_Object object = new_object(NULL, type);
   const M_Object object = new_object(shred->info->mp, shred, type);
   *(M_Object*)REG(0) =  object;
   PUSH_REG(shred, SZ_INT);
index 1dd63ab2d9f3f11a7f3e08266a598b5dd1f7b9c0..2100c571ed9aa5ae0c349fa71746d47ffdb7539f 100644 (file)
@@ -13,7 +13,7 @@
 #include "shreduler_private.h"
 #include "gwion.h"
 
-static m_int o_fork_thread, o_fork_retsize, o_fork_retval;
+static m_int o_fork_thread, o_shred_cancel, o_fork_done, o_fork_ev, o_fork_retsize, o_fork_retval;
 #define FORK_THREAD(o) *(THREAD_TYPE*)(o->data + o_fork_thread)
 #define FORK_RETSIZE(o) *(m_int*)(o->data + o_fork_retsize)
 #define FORK_RETVAL(o) (o->data + o_fork_retval)
@@ -22,8 +22,8 @@ M_Object new_shred(const VM_Shred shred, m_bool is_spork) {
   const M_Object obj = new_object(shred->info->mp, NULL, is_spork ? t_shred : t_fork);
   ME(obj) = shred;
   if(!is_spork) {
-//    *(M_Object*)(obj->data + o_fork_ev) = new_object(NULL, t_event);
-//    EV_SHREDS(*(M_Object*)(obj->data + o_fork_ev)) = new_vector();
+    *(M_Object*)(obj->data + o_fork_ev) = new_object(shred->info->mp, NULL, t_event);
+    EV_SHREDS(*(M_Object*)(obj->data + o_fork_ev)) = new_vector(shred->info->mp);
   }
   return obj;
 }
@@ -56,11 +56,9 @@ static MFUN(shred_yield) {
 static SFUN(vm_shred_from_id) {
   const m_int index =  *(m_int*)MEM(0);
   const VM_Shred s = (VM_Shred)vector_at(&shred->tick->shreduler->shreds, (vtype)index);
-  if(s) {
+  if(s)
     *(M_Object*)RETURN = s->info->me;
-//    s->info->me->ref++;
-//    vector_add(&shred->gc, (vtype) s->info->me);
-  } else
+  else
     *(m_uint*)RETURN = 0;
 }
 
@@ -99,13 +97,26 @@ describe_path_and_dir(_code, s->code->name)
 static DTOR(shred_dtor) { free_vm_shred(*(VM_Shred*)o->data); }
 
 static DTOR(fork_dtor) {
+//  pthread_detach(FORK_THREAD(o));
+  THREAD_JOIN(FORK_THREAD(o));
   mp_free(shred->info->mp, Gwion, ME(o)->info->vm->gwion);
   free_vm(ME(o)->info->vm);
 }
 
 static MFUN(fork_join) {
-  /* int pret = */ THREAD_JOIN(FORK_THREAD(o));
-  release(o, shred);
+  if(*(m_int*)(o->data + o_fork_done))
+    return;
+  shreduler_remove(shred->tick->shreduler, shred, 0);
+  vector_add(EV_SHREDS(*(M_Object*)(o->data + o_fork_ev)), (vtype)shred);
+}
+
+//static MFUN(shred_cancel) {
+//  ++*(m_int*)(o->data + o_shred_cancel);
+//}
+
+static MFUN(shred_test_cancel) {
+  if(*(m_int*)(o->data + o_shred_cancel))
+    vm_shred_exit(ME(o));
 }
 
 void fork_retval(const M_Object o) {
@@ -114,10 +125,16 @@ void fork_retval(const M_Object o) {
 }
 
 static ANN void* fork_run(void* data) {
-  M_Object me = (M_Object)data;
+  const M_Object me = (M_Object)data;
   VM *vm = ME(me)->info->vm;
-  vm_run(vm);
+  do {
+    vm_run(vm);
+    ++vm->bbq->pos;
+  } while(vm->bbq->is_running);
   fork_retval(me);
+  *(m_int*)(me->data + o_fork_done) = 1;
+  broadcast(*(M_Object*)(me->data + o_fork_ev));
+  _release(me, ME(me));
   THREAD_RETURN(NULL);
 }
 
@@ -135,6 +152,9 @@ GWION_IMPORT(shred) {
   gwi_item_ini(gwi, "int", "@me");
   CHECK_BB(gwi_item_end(gwi, ae_flag_member, NULL))
 
+  gwi_item_ini(gwi, "int", "cancel");
+  CHECK_BB((o_shred_cancel = gwi_item_end(gwi, 0, NULL)))
+
   gwi_func_ini(gwi, "void", "exit", gw_shred_exit);
   CHECK_BB(gwi_func_end(gwi, 0))
 
@@ -173,6 +193,10 @@ GWION_IMPORT(shred) {
   gwi_func_ini(gwi, "string", "code_dir", shred_code_dir);
   CHECK_BB(gwi_func_end(gwi, 0))
 
+//  gwi_func_ini(gwi, "void", "cancel", shred_cancel);
+//  CHECK_BB(gwi_func_end(gwi, 0))
+  gwi_func_ini(gwi, "void", "test_cancel", shred_test_cancel);
+  CHECK_BB(gwi_func_end(gwi, 0))
   CHECK_BB(gwi_class_end(gwi))
 
   gwi_item_ini(gwi, "Shred", "me");
@@ -183,6 +207,10 @@ GWION_IMPORT(shred) {
   CHECK_BB(gwi_class_ini(gwi, t_fork, NULL, fork_dtor))
   gwi_item_ini(gwi, "int", "@thread");
   CHECK_BB((o_fork_thread = gwi_item_end(gwi, ae_flag_const, NULL)))
+  gwi_item_ini(gwi, "int", "is_done");
+  CHECK_BB((o_fork_done = gwi_item_end(gwi, ae_flag_const, NULL)))
+  gwi_item_ini(gwi, "Event", "ev");
+  CHECK_BB((o_fork_ev = gwi_item_end(gwi, ae_flag_const, NULL)))
   gwi_item_ini(gwi, "int", "retsize");
   CHECK_BB((o_fork_retsize = gwi_item_end(gwi, ae_flag_const, NULL)))
   o_fork_retval = t_fork->nspc->info->offset;
index 1655f1600d3aed7e13843f15dfd592a587908013..8e1b3e96c4dd87d59da31b75f223d65896436059 100644 (file)
@@ -16,6 +16,7 @@ ANN VM_Shred shreduler_get(const Shreduler s) {
   Driver *bbq = s->bbq;
   struct ShredTick_ *tk = s->list;
   if(!tk) {
+//printf("here %p %lu\n", s, s->bbq->pos);
     if(!vector_size(&s->shreds) && !s->loop)
       bbq->is_running = 0;
     return NULL;
index e6c5304a864daf02b59b7abb11f340e35d6ccc5a..ee99e276dda59b9be94b20ecb959d4f21dd5f5ec 100644 (file)
@@ -91,6 +91,8 @@ ANN m_uint vm_add_shred(const VM* vm, const VM_Shred shred) {
 ANN m_uint vm_fork(const VM* src, const VM_Shred shred) {
   VM* vm = shred->info->vm = gwion_cpy(src);
   shred->info->me = new_shred(shred, 0);
+//  shreduler_add(vm->shreduler, shred);
+//  shredule(vm->shreduler, shred, .5);
   shreduler_add(vm->shreduler, shred);
   shredule(vm->shreduler, shred, .5);
   return shred->tick->xid;
@@ -242,7 +244,8 @@ __attribute__((hot))
 
 __attribute__ ((optimize("-O2")))
 ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
-  static const void* dispatch[] = {
+//printf("here %p\n", vm->shreduler);
+static const void* dispatch[] = {
     &&regsetimm,
     &&regpushimm, &&regpushfloat, &&regpushother, &&regpushaddr,
     &&regpushmem, &&regpushmemfloat, &&regpushmemother, &&regpushmemaddr,
@@ -348,7 +351,7 @@ regpushmemother:
 //  LOOP_OPTIM
   for(m_uint i = 0; i <= instr->m_val2; i+= SZ_INT) {
     m_uint* m0 = __builtin_assume_aligned((m_bit*)mem+i, SZ_INT);
-printf("%p\n", m0);
+//printf("%p\n", m0);
 //    m_uint* m = __builtin_assume_aligned((m_bit*)mem+instr->m_val+i, SZ_INT);
     m_uint* r = __builtin_assume_aligned(reg+i, SZ_INT);
 //    *(m_uint*)(reg+i) = *(m_uint*)((m_bit*)(mem + instr->m_val) + i);
@@ -573,7 +576,9 @@ timeadv:
 {
   register const m_float f = *(m_float*)(reg-SZ_FLOAT);
   *(m_float*)(reg-SZ_FLOAT) = (shred->tick->wake_time += f);
+//printf("here adv %p %lu\n", s, s->bbq->is_running);
   shredule(s, shred, f);
+//printf("here adv %p %p %lu\n", shred->tick->shreduler, s, s->bbq->is_running);
 }
 shred->code = code;
 shred->reg = reg;
@@ -823,6 +828,7 @@ mem = shred->mem;
 pc = shred->pc;
 DISPATCH()
     } while(s->curr);
+//printf("no more curr %p\n", vm->shreduler);
 #ifdef VMBENCH
 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &exec_end);
 timespecsub(&exec_end, &exec_ini, &exec_ret);
@@ -836,6 +842,7 @@ timespecadd(&exec_time, &exec_ret, &exec_time);
 #endif
     return;
 }
+if(vector_size(&vm->ugen))
   vm_ugen_init(vm);
 }
 //#pragma GCC pop_options
\ No newline at end of file
index 7842bcac78ff463fbd1820e67e500d9cedad410b..221e98d660ef89bd3acb631978ff4a0e4f5e75d2 100644 (file)
@@ -13,7 +13,7 @@
 
 GWION_IMPORT(global_var_test) {
 //  ALLOC_PTR(i, m_uint, 1);
-  M_Object i = new_string(gwi->gwion->p, NULL, "test");
+  const M_Object i = gwion_new_string(gwi->gwion, "test");
   CHECK_BB(gwi_item_ini(gwi,"string", "i"))
   CHECK_BB(gwi_item_end(gwi, 0, i))
   return GW_OK;
index 5a180c110038018dedf4f16c6ed9f20780c916e3..486d0563fb14275336f9e48ccc6fe6c77fadfe94 100644 (file)
@@ -12,8 +12,9 @@
 #include "gwi.h"
 
 GWION_IMPORT(static_string_test) {
+  const M_Object obj = gwion_new_string(gwi->gwion, "test static string");
   CHECK_BB(gwi_item_ini(gwi, "string", "self"))
-  M_Object obj = new_string(gwi->gwion->p, NULL, "test static string");
-  CHECK_BB(gwi_item_end(gwi, ae_flag_global, obj))
+//  CHECK_BB(gwi_item_end(gwi, ae_flag_global, obj))
+  CHECK_BB(gwi_item_end(gwi, 0, obj))
   return GW_OK;
 }