diff --git a/source/vibe/core/core.d b/source/vibe/core/core.d index d7f85e3..1ada49c 100644 --- a/source/vibe/core/core.d +++ b/source/vibe/core/core.d @@ -1103,7 +1103,7 @@ struct TimerCallbackHandler { cb(); } - if (!eventDriver.timers.isUnique(timer)) + if (!eventDriver.timers.isUnique(timer) || eventDriver.timers.isPending(timer)) eventDriver.timers.wait(timer, &handle); } } diff --git a/tests/issue-104-unreferenced-periodic-timer.d b/tests/issue-104-unreferenced-periodic-timer.d new file mode 100644 index 0000000..f14b839 --- /dev/null +++ b/tests/issue-104-unreferenced-periodic-timer.d @@ -0,0 +1,23 @@ +/+ dub.sdl: + name "test" + dependency "vibe-core" path=".." ++/ +module test; + +import vibe.core.core; + +import core.memory; +import core.time; + + +int main() +{ + setTimer(10.seconds, { assert(false, "Event loop didn't exit in time."); }); + + // make sure that periodic timers for which no explicit reference is stored + // are still getting invoked periodically + size_t i = 0; + setTimer(50.msecs, { if (i++ == 3) exitEventLoop(); }, true); + + return runEventLoop(); +}