Am 10.01.2018 um 15:39 schrieb crimaniak:
Hi!
I make multi-task event bus, but there is a problem with the task stops.
Please see end of file
https://github.com/crimaniak/d-vision/blob/master/src/vision/eventbus.d
Expected behavior: After sending the StopEvent message in line 244 it is
must be detected in listeners (line 147), so all listeners must set exit
flag to 'true' and quit immediately.
De-facto behavior: StopEvent() message is not detected by the first
delegate in line 147 (logger task logs this message by the handler in
line 185), so subscribed tasks never exit and test stops on line 248.
I tried to play with yield() and sleep(), with 'shared' attributes and
so on, but without result. Can you say please what I am doing wrong here?
'dub test' can be used to play with tests.
The problem is with the `immutable struct StopEvent {}` declaration and
the use of `shared(Unqual!StopEvent)` - `shared(StopEvent)` is actually
reduced to just `StopEvent`, which internally is expanded to
`immutable(StopEvent)` and `immutable` already implies `shared`.
However, `Unqual!StopEvent` actually removes the implicit `immutable`
from the type, so that `shared(Unqual!StopEvent)` is really just
`shared(StopEvent)` and consequently treated as a different type by
`receive`.
So, removing the `immutable` from the declaration solved the issue for
me, but if possible I'd rather remove the `cast(shared
Unqual!EventType)` from `emit`, and pass `shared`/`immutable` events to
it from the outside (or plain events with no unshared indirections).