add jtk.event.wait_event()

This commit is contained in:
Josh Holtrop 2020-07-08 14:14:29 -04:00
parent 303d387c20
commit a0910191da

View File

@ -2,6 +2,7 @@ module jtk.event;
import core.thread; import core.thread;
import core.sync.mutex; import core.sync.mutex;
import core.sync.condition;
import std.container.dlist; import std.container.dlist;
import jtk.timer; 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 DList!(Event *) * event_list;
private __gshared Mutex event_list_mutex; private __gshared Mutex event_list_mutex;
private __gshared Mutex wait_event_mutex;
private __gshared Condition wait_event_condition;
Event * check_event() Event * check_event()
{ {
Event * rv = null; synchronized(event_list_mutex)
event_list_mutex.lock_nothrow();
if (!event_list.empty)
{ {
rv = event_list.front; if (!event_list.empty)
event_list.removeFront(); {
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() private void event_thread()
@ -73,12 +97,16 @@ private void event_thread()
for (;;) for (;;)
{ {
Event * event = new Event; Event * event = new Event;
ulong time_until_next_timer_expiry = ulong time_until_next_timer_expiry = Timer.time_to_next_timer_expiration();
jtk.timer.Timer.time_to_next_timer_expiration();
jtk_wait_event(event, time_until_next_timer_expiry); jtk_wait_event(event, time_until_next_timer_expiry);
event_list_mutex.lock_nothrow(); synchronized(event_list_mutex)
event_list.insertBack(event); {
event_list_mutex.unlock_nothrow(); 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 = new DList!(Event *);
event_list_mutex = new Mutex; event_list_mutex = new Mutex;
wait_event_mutex = new Mutex;
wait_event_condition = new Condition(wait_event_mutex);
new Thread(&event_thread).start(); new Thread(&event_thread).start();
} }