Skip to content

TaggedUnion assert failure when waiting an event from a different thread #238

@yellowsink

Description

@yellowsink

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions