]> Nishi Git Mirror - gwion.git/commitdiff
:white_check_mark: Update slice test
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 30 Nov 2019 21:12:51 +0000 (22:12 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 30 Nov 2019 21:12:51 +0000 (22:12 +0100)
include/gwiondata.h
src/gwion.c
src/gwiondata.c
src/lib/shred.c
tests/import/test.log [new file with mode: 0644]
tests/slice/slice_array.gw

index 155879cf04347c6dbaefcab51781e9c8d683bfca..046f15b7a718d8c7bb2af794ca4c31874ac42059 100644 (file)
@@ -12,5 +12,7 @@ typedef struct GwionData_ {
 } GwionData;
 
 ANN GwionData* new_gwiondata(MemPool);
+ANN GwionData* cpy_gwiondata(MemPool, const GwionData*);
 ANN void free_gwiondata(const struct Gwion_*);
+ANN void free_gwiondata_cpy(const MemPool, GwionData*);
 #endif
index bad13366a285e88992dd8b328b746b51734d9739..4bb4c9dbdcfea61076572003d5926ff95b6bf427 100644 (file)
@@ -11,7 +11,6 @@
 #include "compile.h"
 #include "object.h" // fork_clean
 #include "pass.h" // fork_clean
-#include "specialid.h" // fork_clean
 #include "shreduler_private.h"
 
 ANN static void driver_arg(const Gwion gwion, Driver *di) {
@@ -44,6 +43,14 @@ ANN static inline void gwion_compile(const Gwion gwion, const Vector v) {
     compile_filename(gwion, (m_str)vector_at(v, i));
 }
 
+ANN static void gwion_cleaner(const Gwion gwion) {
+  if(!gwion->type[et_shred])
+    return;
+  const VM_Code code = new_vm_code(gwion->mp, NULL, 0, ae_flag_builtin, "in code dtor");
+  gwion->vm->cleaner_shred = new_vm_shred(gwion->mp, code);
+  vm_add_shred(gwion->vm, gwion->vm->cleaner_shred);
+}
+
 ANN VM* gwion_cpy(const VM* src) {
   const Gwion gwion = mp_calloc(src->gwion->mp, Gwion);
   gwion->vm = new_vm(src->gwion->mp, 0);
@@ -51,7 +58,7 @@ ANN VM* gwion_cpy(const VM* src) {
   gwion->vm->bbq->si = soundinfo_cpy(src->gwion->mp, src->bbq->si);
   gwion->emit = src->gwion->emit;
   gwion->env = src->gwion->env;
-  gwion->data = src->gwion->data;
+  gwion->data = cpy_gwiondata(src->gwion->mp, src->gwion->data);
   gwion->st = src->gwion->st;
   gwion->mp = src->gwion->mp;
   gwion->type = src->gwion->type;
@@ -95,36 +102,35 @@ ANN void gwion_run(const Gwion gwion) {
   vm->bbq->driver->run(vm, vm->bbq);
 }
 
-ANN static void fork_clean2(const Vector v) {
+ANN static void gwion_end_child(const VM_Shred shred, const Gwion gwion);
+
+ANN static inline void free_gwion_cpy(const Gwion gwion, const VM_Shred shred) {
+  gwion_end_child(shred, gwion);
+  free_vm(gwion->vm);
+  free_gwiondata_cpy(gwion->mp, gwion->data);
+  mp_free(gwion->mp, Gwion, gwion);
+}
+
+ANN static void fork_clean2(const VM_Shred shred, const Vector v) {
   for(m_uint i = 0; i < vector_size(v); ++i) {
     VM* vm = (VM*)vector_at(v, i);
-    const Gwion gwion = vm->gwion;
-    free_vm(vm);
-    mp_free(gwion->mp, Gwion, gwion);
+    free_gwion_cpy(vm->gwion, shred);
   }
   vector_release(v);
 }
 
-ANN static void gwion_end_child(const Gwion gwion) {
+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(gwion->vm->cleaner_shred, &gwion->data->child);
+    fork_clean(shred, &gwion->data->child);
   if(gwion->data->child2.ptr)
-    fork_clean2(&gwion->data->child2);
+    fork_clean2(shred, &gwion->data->child2);
   MUTEX_UNLOCK(gwion->vm->shreduler->mutex);
 }
 
-ANN static void gwion_cleaner(const Gwion gwion) {
-  if(!gwion->type[et_shred])
-    return;
-  const VM_Code code = new_vm_code(gwion->mp, NULL, 0, ae_flag_builtin, "in code dtor");
-  gwion->vm->cleaner_shred = new_vm_shred(gwion->mp, code);
-  vm_add_shred(gwion->vm, gwion->vm->cleaner_shred);
-}
-
 ANN void gwion_end(const Gwion gwion) {
   gwion_cleaner(gwion);
-  gwion_end_child(gwion);
+  gwion_end_child(gwion->vm->cleaner_shred, gwion);
   free_env(gwion->env);
   if(gwion->vm->cleaner_shred)
     free_vm_shred(gwion->vm->cleaner_shred);
index 9e617dbbf806cef843a717baa3437c3a49855d6e..533496a9346603812cb64148284b162672bc0e88 100644 (file)
 #include "specialid.h"
 #include "pass.h"
 
-ANN GwionData* new_gwiondata(MemPool mp) {
+ANN static inline GwionData* gwiondata(MemPool mp) {
   struct GwionData_ *data = mp_calloc(mp, GwionData);
+  MUTEX_SETUP(data->mutex);
+  return data;
+}
+
+ANN GwionData* new_gwiondata(MemPool mp) {
+  GwionData *data = gwiondata(mp);
   map_init(&data->freearg);
   map_init(&data->id);
   vector_init(&data->reserved);
   data->passes = new_passes(mp);
-  MUTEX_SETUP(data->mutex);
   return data;
 }
 
+ANN GwionData* cpy_gwiondata(MemPool mp, const GwionData* src) {
+  GwionData *data = gwiondata(mp);
+  data->freearg = src->freearg;
+  data->id = src->id;
+  data->reserved = src->reserved;
+  data->plug = src->plug;
+  data->passes = src->passes;
+  return data;
+}
+
+ANN void free_gwiondata_cpy(const MemPool mp, GwionData *data) {
+  MUTEX_CLEANUP(data->mutex);
+  mp_free(mp, GwionData, data);
+}
+
 ANN void free_gwiondata(const struct Gwion_ *gwion) {
-  struct GwionData_ *data = gwion->data;
+  GwionData *data = gwion->data;
   map_release(&data->freearg);
   for(m_uint i = 0; i < map_size(&data->id); ++i)
     mp_free(gwion->mp, SpecialId, (struct SpecialId_*)map_at(&data->id, i));
@@ -30,6 +50,5 @@ ANN void free_gwiondata(const struct Gwion_ *gwion) {
   free_passes(data->passes);
   if(data->plug)
     free_plug(gwion);
-  MUTEX_CLEANUP(data->mutex);
-  mp_free(gwion->mp, GwionData, data);
+  free_gwiondata_cpy(gwion->mp, data);
 }
index a2c23124ccf5be0d8a3c06f8e687c4977e55ef80..fd430fbac93067488711ff5a2de9e05f30ce0092 100644 (file)
@@ -135,7 +135,8 @@ describe_path_and_dir(, s->info->name)
 describe_path_and_dir(_code, s->code->name)
 
 static DTOR(shred_dtor) {
-  free_vm_shred(ME(o));
+  if(ME(o))
+    free_vm_shred(ME(o));
 }
 
 static MFUN(shred_lock) {
@@ -148,9 +149,12 @@ static MFUN(shred_unlock) {
 
 static DTOR(fork_dtor) {
   THREAD_JOIN(FORK_THREAD(o));
+  const VM *vm = FORK_ORIG(o);
   if(*(m_int*)(o->data + o_fork_done)) {
-    vector_rem2(&FORK_ORIG(o)->gwion->data->child, (vtype)o);
-    vector_add(&FORK_ORIG(o)->gwion->data->child2, (vtype)ME(o)->info->vm);
+    vector_rem2(&vm->gwion->data->child, (vtype)o);
+    if(!vm->gwion->data->child2.ptr)
+      vector_init(&vm->gwion->data->child2);
+    vector_add(&vm->gwion->data->child2, (vtype)ME(o)->info->vm);
   }
 }
 
@@ -210,17 +214,14 @@ 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) {
+  if(!vm->gwion->data->child.ptr)
     vector_init(&vm->gwion->data->child);
-    vector_init(&vm->gwion->data->child2);
-  }
   vector_add(&vm->gwion->data->child, (vtype)o);
   FORK_ORIG(o) = (VM*)vm;
   FORK_RETSIZE(o) = sz;
   THREAD_CREATE(FORK_THREAD(o), fork_run, o);
 }
 
-
 ANN void fork_clean(const VM_Shred shred, const Vector v) {
   for(m_uint i = 0; i < vector_size(v); ++i) {
     const M_Object o = (M_Object)vector_at(v, i);
diff --git a/tests/import/test.log b/tests/import/test.log
new file mode 100644 (file)
index 0000000..23d7fa2
--- /dev/null
@@ -0,0 +1,15 @@
+op_already_imported.gw ==964533== Memcheck, a memory error detector
+==964533== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
+==964533== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
+==964533== Command: ./../../gwion -p. -m dummy -d dummy op_already_imported.gw
+==964533== Parent PID: 963027
+==964533== 
+==964533== 
+==964533== HEAP SUMMARY:
+==964533==     in use at exit: 0 bytes in 0 blocks
+==964533==   total heap usage: 869 allocs, 869 frees, 17,602,040 bytes allocated
+==964533== 
+==964533== All heap blocks were freed -- no leaks are possible
+==964533== 
+==964533== For lists of detected and suppressed errors, rerun with: -s
+==964533== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
index d2d858675df647bc00aa0728688116cf9e17d75e..5c07a731dec316113394f6619d91e92a38dbf6ac 100644 (file)
@@ -1,4 +1,4 @@
-[1,2,3] @=> auto i;
-i[1:2];
-i[:2];
-i[2: -1];
+<<< [1,2,3] @=> auto i >>>;
+<<< i[1:2] >>>;
+<<< i[:2] >>>;
+<<< i[2: -1] >>>;