]> Nishi Git Mirror - gwion.git/commitdiff
:art: Shreduler now uses bbq
authorfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 13 Mar 2019 11:28:13 +0000 (12:28 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 13 Mar 2019 11:28:40 +0000 (12:28 +0100)
include/shreduler_private.h
src/vm/shreduler.c
src/vm/vm.c

index d6d4ad1f58562b6081acd9f0697c2604c6b7617c..d555f9d8188ab2492045f8a2953f0dfcf44796ba 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __SHREDULER
 #define __SHREDULER
 struct  Shreduler_ {
-  VM* vm;
+  struct BBQ_ *bbq;
   struct ShredTick_ *list;
   struct ShredTick_ *curr;
   struct Vector_ shreds;
index 025d7a5668a13905d6063cf56665bc2f10e46df4..0bf67b6a9973467026df7bb0ab974b531216fd4b 100644 (file)
@@ -4,22 +4,23 @@
 #include "oo.h"
 #include "vm.h"
 #include "object.h"
-#include "shreduler_private.h"
 #include "driver.h"
+#include "shreduler_private.h"
+#include "instr.h" // unwind
 
 ANN void shreduler_set_loop(const Shreduler s, const m_bool loop) {
   s->loop = loop < 0 ? 0 : 1;
 }
 
 ANN VM_Shred shreduler_get(const Shreduler s) {
-  VM* vm = s->vm;
+  Driver *bbq = s->bbq;
   struct ShredTick_ *tk = s->list;
   if(!tk) {
     if(!vector_size(&s->shreds) && !s->loop)
-      vm->bbq->is_running = 0;
+      bbq->is_running = 0;
     return NULL;
   }
-  const m_float time = (m_float)vm->bbq->pos + (m_float).5;
+  const m_float time = (m_float)bbq->pos + (m_float).5;
   if(tk->wake_time <= time) {
     if((s->list = tk->next))
       s->list->prev = NULL;
@@ -37,7 +38,7 @@ ANN static void shreduler_parent(const VM_Shred out, const Vector v) {
     out->tick->parent->child.ptr = NULL;
   }
 }
-#include "instr.h"
+
 ANN static void unwind(const VM_Shred shred) {
   VM_Code code = shred->code;
   while(1) {
@@ -85,7 +86,7 @@ ANN void shreduler_remove(const Shreduler s, const VM_Shred out, const m_bool er
 }
 
 ANN void shredule(const Shreduler s, const VM_Shred shred, const m_float wake_time) {
-  const m_float time = wake_time + (m_float)s->vm->bbq->pos;
+  const m_float time = wake_time + (m_float)s->bbq->pos;
   struct ShredTick_ *tk = shred->tick;
   tk->wake_time = time;
   if(s->list) {
index 3dc1c68583e2f55918c3f4ce7b4b2bb17fad2240..6de108cb1d3f0572bb5040dc21a84334bf55ca4e 100644 (file)
@@ -49,12 +49,12 @@ uint32_t gw_rand(uint32_t s[2]) {
 }
 
 VM* new_vm(void) {
-  VM* vm = (VM*)xcalloc(1, sizeof(VM));
-  vm->shreduler  = (Shreduler)xcalloc(1, sizeof(struct Shreduler_));
-  vm->shreduler->vm = vm;
-  vector_init(&vm->shreduler->shreds);
+  VM* vm = (VM*)mp_alloc(VM);
   vector_init(&vm->ugen);
   vm->bbq = new_driver();
+  vm->shreduler  = (Shreduler)mp_alloc(Shreduler);
+  vector_init(&vm->shreduler->shreds);
+  vm->shreduler->bbq = vm->bbq;
   gw_seed(vm->rand, (uint64_t)time(NULL));
   return vm;
 }
@@ -74,8 +74,8 @@ ANN void free_vm(VM* vm) {
   vector_release(&vm->ugen);
   if(vm->bbq)
     free_driver(vm->bbq, vm);
-  xfree(vm->shreduler);
-  free(vm);
+  mp_free(Shreduler, vm->shreduler);
+  mp_free(VM, vm);
 }
 
 ANN m_uint vm_add_shred(const VM* vm, const VM_Shred shred) {
@@ -219,7 +219,7 @@ __attribute__((hot))
     (m_int)(*(m_float*)(reg-SZ_INT))); \
   DISPATCH()
 
-ANN void vm_run(const VM* vm) { /* lgtm [cpp/use-of-goto] */
+ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
   static const void* dispatch[] = {
     &&regsetimm,
     &&regpushimm, &&regpushfloat, &&regpushother, &&regpushaddr,