]> Nishi Git Mirror - gwion.git/commitdiff
:art: Test shred.cancel
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 22:27:03 +0000 (00:27 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 22:28:09 +0000 (00:28 +0200)
src/lib/shred.c
tests/tree/shred_cancel.gw [new file with mode: 0644]

index 8ab294244fe592e8de54e93cfaae889bfb5b0851..85d2bb6603a5bbdcd6111c7f10332ad14b681eb3 100644 (file)
@@ -178,16 +178,22 @@ static MFUN(fork_join) {
 }
 
 static MFUN(shred_cancel) {
-MUTEX_LOCK(ME(o)->tick->shreduler->mutex);
+  MUTEX_LOCK(ME(o)->tick->shreduler->mutex);
   *(m_int*)(o->data + o_shred_cancel) = *(m_int*)MEM(SZ_INT);
-MUTEX_UNLOCK(ME(o)->tick->shreduler->mutex);
+  MUTEX_UNLOCK(ME(o)->tick->shreduler->mutex);
 }
 
 static MFUN(shred_test_cancel) {
-MUTEX_LOCK(ME(o)->tick->shreduler->mutex);
-  if(*(m_int*)(o->data + o_shred_cancel))
+  MUTEX_LOCK(ME(o)->tick->shreduler->mutex);
+  if(*(m_int*)(o->data + o_shred_cancel)) {
+    const m_bool is_me = ME(o) == shred;
+    if(is_me)
+      MUTEX_UNLOCK(ME(o)->tick->shreduler->mutex);
     vm_shred_exit(ME(o));
-MUTEX_UNLOCK(ME(o)->tick->shreduler->mutex);
+    if(is_me)
+      return;
+  }
+  MUTEX_UNLOCK(ME(o)->tick->shreduler->mutex);
 }
 
 void fork_retval(const M_Object o) {
@@ -236,10 +242,10 @@ GWION_IMPORT(shred) {
   GWI_BB(gwi_class_ini(gwi,  t_shred, NULL, shred_dtor))
 
   gwi_item_ini(gwi, "int", "@me");
-  GWI_BB(gwi_item_end(gwi, ae_flag_member, NULL))
+  GWI_BB(gwi_item_end(gwi, ae_flag_const, NULL))
 
   gwi_item_ini(gwi, "int", "cancel");
-  GWI_BB((o_shred_cancel = gwi_item_end(gwi, 0, NULL)))
+  GWI_BB((o_shred_cancel = gwi_item_end(gwi, ae_flag_const, NULL)))
 
   gwi_func_ini(gwi, "void", "exit", gw_shred_exit);
   GWI_BB(gwi_func_end(gwi, 0))
diff --git a/tests/tree/shred_cancel.gw b/tests/tree/shred_cancel.gw
new file mode 100644 (file)
index 0000000..92151a2
--- /dev/null
@@ -0,0 +1,5 @@
+me.set_cancel(0);
+me.test_cancel();
+me.set_cancel(1);
+me.test_cancel();
+<<< "wont reach" >>>;