bugfixes with range iterator and mutex improvement
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 23 Nov 2021 18:24:53 +0000 (12:24 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 23 Nov 2021 18:24:53 +0000 (12:24 -0600)
core/container/iter.onyx
core/sync/mutex.onyx

index 8778c9cd8d6f55c671b8d4d4d537ae1c23c1b580..c035c8d113f67b55d13726993322c9b1e09060ab 100644 (file)
@@ -338,11 +338,21 @@ from_array :: (arr: [] $T) -> Iterator(^T) {
     }
 
     next :: (use c: ^Context) -> (i32, bool) {
-        if v >= r.high {
-            return 0, false;
+        if r.step > 0 {
+            if v >= r.high {
+                return 0, false;
+            } else {
+                defer v += r.step;
+                return v, true;
+            }
+
         } else {
-            defer v += r.step;
-            return v, true;
+            if v < r.high {
+                return 0, false;
+            } else {
+                defer v += r.step;
+                return v, true;
+            }
         }
     }
 
index 5fb2316079c7df2eb884c481c81d2e27de5bb656..906182845d0800700890f53645c19b2c5e5091c6 100644 (file)
@@ -24,10 +24,12 @@ Mutex :: struct {
 
 mutex_init :: (m: ^Mutex) {
     m.lock = 0;
+    m.owner = -1;
 }
 
 mutex_destroy :: (m: ^Mutex) {
     m.lock = -1;
+    m.owner = -1;
 }
 
 mutex_lock :: (m: ^Mutex) {
@@ -42,6 +44,8 @@ mutex_lock :: (m: ^Mutex) {
             if context.thread_id != 0 {
                 __atomic_wait(^m.lock, 1);
             }
+        } else {
+            while (m.lock == 1) ---
         }
     }
 
@@ -68,6 +72,7 @@ scoped_mutex :: macro (m: ^Mutex) {
 }
 
 critical_section :: macro (m: ^Mutex, body: Code) -> i32 {
+    scoped_mutex :: scoped_mutex;
     scoped_mutex(m);
 
     #insert body;