-
Notifications
You must be signed in to change notification settings - Fork 40
Open
Description
When attempting to wait for an event created on the main thread from a second thread (as far as I can tell from the documentation, that is allowed), the wait() call (not even processevents!) causes an assertion failure in taggedunion.
I've attached a minimal reproduction, but for reference, I encountered this within a more complex project with this demo code: https://github.com/yellowsink/rockhopper/blob/ed05a03/source/app.d
Minimal reproduction code:
import eventcore.core : eventDriver;
import core.thread.osthread : Thread;
import std.stdio : writeln;
void main()
{
auto drv1 = eventDriver;
//shared drv1shared = cast(shared) eventDriver; // only necessary to trigger from thread 2, irrelevant
// making this `shared` has no effect.
auto ev1_to_2 = drv1.events.create();
new Thread({
auto drv2 = eventDriver;
try {
drv2.events.wait(ev1_to_2, (_e) nothrow {});
}
catch (Exception t)
{
writeln(t);
}
}).start();//.join(); has no effect
}library versions:
{
"fileVersion": 1,
"versions": {
"eventcore": "0.9.30",
"libasync": "0.8.6",
"memutils": "1.0.10",
"taggedalgebraic": "0.11.23"
}
}exception message (DMD, LDC gives a more compact stack trace):
core.exception.AssertError@../../.dub/packages/taggedalgebraic/0.11.23/taggedalgebraic/source/taggedalgebraic/taggedunion.d(309): Attempting to get type EventSlot from a TaggedUnion with type typeof(null)
----------------
??:? _d_assert_msg [0x5be29787a22c]
../../.dub/packages/taggedalgebraic/0.11.23/taggedalgebraic/source/taggedalgebraic/taggedunion.d:309 inout pure nothrow ref @property @nogc @safe inout(eventcore.drivers.posix.events.EventSlot) taggedalgebraic.taggedunion.TaggedUnion!(eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot, eventcore.drivers.posix.pipes.PipeSlot).AlgebraicChoppedVector.U).TaggedUnion.value!(eventcore.drivers.posix.events.EventSlot).value() [0x5be297845a1b]
../../.dub/packages/taggedalgebraic/0.11.23/taggedalgebraic/source/taggedalgebraic/taggedalgebraic.d:767 pure nothrow ref @nogc @safe inout(eventcore.drivers.posix.events.EventSlot) taggedalgebraic.taggedalgebraic.get!(eventcore.drivers.posix.events.EventSlot, eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot, eventcore.drivers.posix.pipes.PipeSlot).AlgebraicChoppedVector.U).get(ref inout(taggedalgebraic.taggedalgebraic.TaggedAlgebraic!(eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot, eventcore.drivers.posix.pipes.PipeSlot).AlgebraicChoppedVector.U).TaggedAlgebraic)) [0x5be2978459b4]
../../.dub/packages/eventcore/0.9.30/eventcore/source/eventcore/internal/utils.d-mixin-311:316 pure nothrow ref @property @nogc @safe eventcore.drivers.posix.events.EventSlot eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot, eventcore.drivers.posix.pipes.PipeSlot).AlgebraicChoppedVector.FullField.event() [0x5be2978384ab]
../../.dub/packages/eventcore/0.9.30/eventcore/source/eventcore/drivers/posix/events.d:251 nothrow @nogc @trusted eventcore.drivers.posix.events.EventSlot* eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.epoll.EpollEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.epoll.EpollEventLoop).PosixEventDriverSockets).PosixEventDriverEvents.getSlot(eventcore.driver.EventID).__lambda2() [0x5be29782adf2]
../../.dub/packages/eventcore/0.9.30/eventcore/source/eventcore/drivers/posix/events.d:251 nothrow @nogc @safe eventcore.drivers.posix.events.EventSlot* eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.epoll.EpollEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.epoll.EpollEventLoop).PosixEventDriverSockets).PosixEventDriverEvents.getSlot(eventcore.driver.EventID) [0x5be29782adb8]
../../.dub/packages/eventcore/0.9.30/eventcore/source/eventcore/drivers/posix/events.d:261 nothrow @nogc @safe bool eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.epoll.EpollEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.epoll.EpollEventLoop).PosixEventDriverSockets).PosixEventDriverEvents.isInternal(eventcore.driver.EventID) [0x5be29782ae54]
../../.dub/packages/eventcore/0.9.30/eventcore/source/eventcore/drivers/posix/events.d:155 nothrow @nogc @safe void eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.epoll.EpollEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.epoll.EpollEventLoop).PosixEventDriverSockets).PosixEventDriverEvents.wait(eventcore.driver.EventID, void delegate(eventcore.driver.EventID) nothrow @safe) [0x5be29782a92f]
source/app.d:26 nothrow void app.main().__lambda3() [0x5be2977fbe91]
??:? void core.thread.context.Callable.opCall() [0x5be29787f73c]
??:? thread_entryPoint [0x5be29787f21a]
??:? [0x786ce035f559]
??:? [0x786ce03dca3b]
Metadata
Metadata
Assignees
Labels
No labels