diff --git a/src/jtk/event.d b/src/jtk/event.d index 934898f..c430463 100644 --- a/src/jtk/event.d +++ b/src/jtk/event.d @@ -2,6 +2,7 @@ module jtk.event; import core.thread; import core.sync.mutex; +import core.sync.condition; import std.container.dlist; import jtk.timer; @@ -54,18 +55,41 @@ private extern(C) void jtk_wait_event(Event * event, ulong time_to_wait); private __gshared DList!(Event *) * event_list; private __gshared Mutex event_list_mutex; +private __gshared Mutex wait_event_mutex; +private __gshared Condition wait_event_condition; Event * check_event() { - Event * rv = null; - event_list_mutex.lock_nothrow(); - if (!event_list.empty) + synchronized(event_list_mutex) { - rv = event_list.front; - event_list.removeFront(); + if (!event_list.empty) + { + Event * rv = event_list.front; + event_list.removeFront(); + return rv; + } + } + return null; +} + +Event * wait_event() +{ + synchronized(wait_event_mutex) + { + for (;;) + { + synchronized(event_list_mutex) + { + if (!event_list.empty) + { + Event * rv = event_list.front; + event_list.removeFront(); + return rv; + } + } + wait_event_condition.wait(); + } } - event_list_mutex.unlock_nothrow(); - return rv; } private void event_thread() @@ -73,12 +97,16 @@ private void event_thread() for (;;) { Event * event = new Event; - ulong time_until_next_timer_expiry = - jtk.timer.Timer.time_to_next_timer_expiration(); + ulong time_until_next_timer_expiry = Timer.time_to_next_timer_expiration(); jtk_wait_event(event, time_until_next_timer_expiry); - event_list_mutex.lock_nothrow(); - event_list.insertBack(event); - event_list_mutex.unlock_nothrow(); + synchronized(event_list_mutex) + { + event_list.insertBack(event); + } + synchronized(wait_event_mutex) + { + wait_event_condition.notifyAll(); + } } } @@ -86,5 +114,7 @@ package void event_init() { event_list = new DList!(Event *); event_list_mutex = new Mutex; + wait_event_mutex = new Mutex; + wait_event_condition = new Condition(wait_event_mutex); new Thread(&event_thread).start(); }