diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3af7ec8..57d0cfa 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: ${{ runner.os }}-dub- - name: Run tests - run: dub -c=unittest-release + run: dub -c=unittest-release -- -d - name: Build run: dub build diff --git a/source/concurrency/operations/race.d b/source/concurrency/operations/race.d index 6bebb98..6bb0e5c 100644 --- a/source/concurrency/operations/race.d +++ b/source/concurrency/operations/race.d @@ -85,10 +85,10 @@ struct RaceSender(Senders...) if (allSatisfy!(ApplyRight!(models, isSender), Sen private class State(Value) : StopSource { import concurrency.bitfield; StopCallback cb; + shared SharedBitField!Flags bitfield; static if (!is(Value == void)) Value value; Exception exception; - shared SharedBitField!Flags bitfield; bool noDropouts; this(bool noDropouts) { this.noDropouts = noDropouts; diff --git a/tests/ut/concurrency/sender.d b/tests/ut/concurrency/sender.d index 26f8ad7..0a76ef6 100644 --- a/tests/ut/concurrency/sender.d +++ b/tests/ut/concurrency/sender.d @@ -101,7 +101,7 @@ import core.atomic : atomicOp; shared int g; auto s = just(1) - .then((int i) @trusted shared { return g.atomicOp!"+="(1); }) + .then((int i) @trusted shared { import std.stdio; auto r = g.atomicOp!"+="(1); r.writeln; return r; }) .via(ThreadSender()) .toShared(); @@ -223,3 +223,17 @@ import core.atomic : atomicOp; race(delay(2.msecs).then(() shared => 2), delay(1.msecs).then(() shared => 1)).syncWait.value.should == 1; } + +@("atomicOp") +@safe unittest { + import concurrency.operations.toshared; + import std.stdio; + + shared int g; + + auto s = justFrom(() @trusted shared => g.atomicOp!"+="(1)) + .via(ThreadSender()); + + whenAll(s,s,s,s,s,s,s,s,s,s).syncWait.assumeOk; + g.should == 10; +}