add jtk.event.wait_event()
This commit is contained in:
parent
303d387c20
commit
a0910191da
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user