Billy Barrow 2 年 前
コミット
8e9bbe51e2
2 ファイル変更41 行追加23 行削除
  1. 19 3
      src/lib/Concrete/Fifo.vala
  2. 22 20
      src/tests/Integration/Parallel.vala

+ 19 - 3
src/lib/Concrete/Fifo.vala

@@ -34,6 +34,22 @@ namespace Invercargill {
             mutex.unlock();
         }
 
+        public void push_start(owned T item) {
+            mutex.lock();
+            var fifo_item = new FifoItem<T>() {
+                next_item = first_item,
+                item = item,
+            };
+
+            if(first_item == null) {
+                last_item = fifo_item;
+            }
+            first_item = fifo_item;
+
+            cond.broadcast();
+            mutex.unlock();
+        }
+
         private bool has_next() {
             mutex.lock();
             while(first_item == null && !marked_complete){
@@ -55,7 +71,7 @@ namespace Invercargill {
             }
             
             mutex.unlock();
-            return item;
+            return item.item;
         }
 
         private Cond cond = Cond ();
@@ -69,8 +85,8 @@ namespace Invercargill {
         }
 
         private class FifoItem<T> {
-            public T item { get; set; }
-            public FifoItem<T>? next_item { get; set; }
+            public T item;
+            public FifoItem<T>? next_item;
         }
 
     }

+ 22 - 20
src/tests/Integration/Parallel.vala

@@ -39,28 +39,30 @@ void parallel_tests() {
     });
 
     // There is a bug here
-    //  Test.add_func("/invercargill/operator/parallel/select_types", () => {
-    //      var items = ate(new Obj1[] { 
-    //          new Obj1() {
-    //              firstname = "Billy",
-    //              lastname = "Barrow"
-    //          },
-    //          new Obj1() {
-    //              firstname = "Dylan",
-    //              lastname = "Erskine"
-    //          }
-    //      });
-
-    //      var result = items.parallel_select<Obj2>(i => new Obj2() { fullname = @"$(i.firstname) $(i.lastname)"}, 2);
+    Test.add_func("/invercargill/operator/parallel/select_types", () => {
+        var items = ate(new Obj1[] { 
+            new Obj1() {
+                firstname = "Billy",
+                lastname = "Barrow"
+            },
+            new Obj1() {
+                firstname = "Dylan",
+                lastname = "Erskine"
+            }
+        });
 
-    //      foreach (var item in result) {
-    //          print(@"Item != null: $(item != null)\n");
-    //          print(item.fullname);
-    //      }
+        var result = items.parallel_select<Obj2>(i => new Obj2() { fullname = @"$(i.firstname) $(i.lastname)"}, 4);
         
-    //      assert_true(result.any(p => p.fullname == "Dylan Erskine"));
-    //      assert_true(result.any(p => p.fullname == "Billy Barrow"));
-    //  });
+        assert_true(result.any(p => p.fullname == "Dylan Erskine"));
+        assert_true(result.any(p => p.fullname == "Billy Barrow"));
+    });
+
+    Test.add_func("/invercargill/operator/parallel/bulk", () => {
+        var numbers = range(0, 1000000, 2);
+
+        var result = numbers.parallel_select<int>(i => i + 1, 4);
+        assert_true(result.no(i => i % 2 == 0));
+    });
 
 }