bugfixes with __atomic_wait
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 17 Oct 2021 22:48:17 +0000 (17:48 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 17 Oct 2021 22:48:17 +0000 (17:48 -0500)
core/alloc/heap.onyx
core/intrinsics/atomics.onyx
core/runtime/js.onyx
core/threads/thread.onyx

index b15d4ce2fb3014b50df5477fe99ee7eaddc8ef6a..ea17f995e072f8a501b20d609a8e1d7d532e9c9d 100644 (file)
@@ -15,7 +15,7 @@ Enable_Debug :: false
 
 #if runtime.Multi_Threading_Enabled {
     sync :: package core.sync
-    
+
     heap_mutex: sync.Mutex
 }
 
index ea449c6b17c9830a232bf3b6c4cc752a1c9ffed0..70cd2536fc004f8289f080da73688fb1fc4b5e55 100644 (file)
@@ -9,7 +9,7 @@ package core.intrinsics.atomics
 }
 
 // __atomic_wait is only valid for i32 and i64
-__atomic_wait   :: (addr: ^$T, value: T, timeout: i64 = 0) -> i32 #intrinsic ---
+__atomic_wait   :: (addr: ^$T, value: T, timeout: i64 = -1) -> i32 #intrinsic ---
 __atomic_notify :: (addr: rawptr, maximum: i32 = 1) -> i32 #intrinsic ---
 
 __atomic_fence  :: () -> void #intrinsic ---
index 63aad0f550ab0601295317b7720f87f500b432e8..083641fa7ee809d8d746796b63a4a8e7fc94eb74 100644 (file)
@@ -30,6 +30,8 @@ __exit          :: (status: i32) -> void #foreign "host" "exit" ---
     }
 
     #export "_thread_exit" (id: i32) {
+        // raw_free(context.allocator, __stack_top);
+        
         thread.__exited(id);
     }
 }
\ No newline at end of file
index b7204115158b69b092c6936e20d1e3b03dad15fa..c45973623f19ab5fa85537aead0b79a71b375c98 100644 (file)
@@ -1,6 +1,7 @@
 package core.thread
 
 use package core
+use package core.intrinsics.atomics
 
 #private {
     thread_mutex   : sync.Mutex;
@@ -28,7 +29,7 @@ spawn :: (t: ^Thread, func: (rawptr) -> void, data: rawptr) {
 }
 
 join :: (t: ^Thread) {
-    while t.alive ---;
+    while t.alive do __atomic_wait(^t.id, t.id);
 }
 
 __initialize :: () {
@@ -41,6 +42,8 @@ __exited :: (id: i32) {
     thread := thread_map->get(id);
     if thread != null {
         thread.alive = false;
+        __atomic_notify(^thread.id);
+        
         thread_map->delete(id);
     }
 }