Add clearExitFlag().

This commit is contained in:
Sönke Ludwig 2016-06-16 10:42:38 +02:00
parent 1e27b33f26
commit 32394bb4c9
2 changed files with 19 additions and 1 deletions

View file

@ -48,6 +48,15 @@ interface EventDriver {
*/ */
void exit(); void exit();
/** Resets the exit flag.
`processEvents` will automatically reset the exit flag before it returns
with `ExitReason.exited`. However, if `exit` is called outside of
`processEvents`, the next call to `processEvents` will return with
`ExitCode.exited` immediately. This function can be used to avoid this.
*/
void clearExitFlag();
// //
// TCP // TCP
// //

View file

@ -106,6 +106,11 @@ abstract class PosixEventDriver : EventDriver {
() @trusted { write(m_wakeupEvent, &one, one.sizeof); } (); () @trusted { write(m_wakeupEvent, &one, one.sizeof); } ();
} }
final override void clearExitFlag()
{
m_exit = false;
}
protected abstract bool doProcessEvents(Duration dur); protected abstract bool doProcessEvents(Duration dur);
abstract void dispose(); abstract void dispose();
@ -491,8 +496,11 @@ abstract class PosixEventDriver : EventDriver {
{ {
assert(event < m_fds.length, "Invalid event ID passed to triggerEvent."); assert(event < m_fds.length, "Invalid event ID passed to triggerEvent.");
if (notify_all) { if (notify_all) {
foreach (w; m_fds[event].waiters.consume) log("emitting");
foreach (w; m_fds[event].waiters.consume) {
log("emitting %s %s", cast(void*)w.funcptr, w.ptr);
w(event); w(event);
}
} else { } else {
if (!m_fds[event].waiters.empty) if (!m_fds[event].waiters.empty)
m_fds[event].waiters.consumeOne(); m_fds[event].waiters.consumeOne();
@ -505,6 +513,7 @@ abstract class PosixEventDriver : EventDriver {
auto thisus = cast(PosixEventDriver)this; auto thisus = cast(PosixEventDriver)this;
assert(event < thisus.m_fds.length, "Invalid event ID passed to shared triggerEvent."); assert(event < thisus.m_fds.length, "Invalid event ID passed to shared triggerEvent.");
int one = 1; int one = 1;
log("emitting thread");
if (notify_all) atomicStore(thisus.m_fds[event].triggerAll, true); if (notify_all) atomicStore(thisus.m_fds[event].triggerAll, true);
() @trusted { write(event, &one, one.sizeof); } (); () @trusted { write(event, &one, one.sizeof); } ();
} }