jtk: Store event list as untranslated events from C to avoid threading issues.
This commit is contained in:
parent
5385718e91
commit
97e4dde563
@ -20,7 +20,7 @@ private struct jtk_event_t
|
||||
|
||||
private extern(C) bool jtk_wait_event(jtk_event_t * event, ulong time_to_wait);
|
||||
|
||||
private __gshared DList!(Event) * event_list;
|
||||
private __gshared DList!(jtk_event_t *) * event_list;
|
||||
private __gshared Mutex event_list_mutex;
|
||||
private __gshared Mutex wait_event_mutex;
|
||||
private __gshared Condition wait_event_condition;
|
||||
@ -87,21 +87,17 @@ class Event
|
||||
|
||||
private void event_thread()
|
||||
{
|
||||
jtk_event_t c_event;
|
||||
for (;;)
|
||||
{
|
||||
jtk_event_t * c_event = new jtk_event_t;
|
||||
ulong time_until_next_timer_expiry = Timer.time_to_next_timer_expiration();
|
||||
if (!jtk_wait_event(&c_event, time_until_next_timer_expiry))
|
||||
if (!jtk_wait_event(c_event, time_until_next_timer_expiry))
|
||||
{
|
||||
break;
|
||||
}
|
||||
synchronized(event_list_mutex)
|
||||
{
|
||||
Event event = c_event_to_event(&c_event);
|
||||
if (event !is null)
|
||||
{
|
||||
event_list.insertBack(event);
|
||||
}
|
||||
event_list.insertBack(c_event);
|
||||
}
|
||||
synchronized(wait_event_mutex)
|
||||
{
|
||||
@ -153,7 +149,7 @@ private Event c_event_to_event(jtk_event_t * c_event)
|
||||
|
||||
package void event_init()
|
||||
{
|
||||
event_list = new DList!(Event);
|
||||
event_list = new DList!(jtk_event_t *);
|
||||
event_list_mutex = new Mutex;
|
||||
wait_event_mutex = new Mutex;
|
||||
wait_event_condition = new Condition(wait_event_mutex);
|
||||
@ -166,7 +162,7 @@ Event check_event()
|
||||
{
|
||||
if (!event_list.empty)
|
||||
{
|
||||
Event rv = event_list.front;
|
||||
Event rv = c_event_to_event(event_list.front);
|
||||
event_list.removeFront();
|
||||
return rv;
|
||||
}
|
||||
@ -184,11 +180,14 @@ Event wait_event()
|
||||
{
|
||||
if (!event_list.empty)
|
||||
{
|
||||
Event rv = event_list.front;
|
||||
Event rv = c_event_to_event(event_list.front);
|
||||
event_list.removeFront();
|
||||
if (rv !is null)
|
||||
{
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
}
|
||||
wait_event_condition.wait();
|
||||
}
|
||||
}
|
||||
|
@ -14,16 +14,16 @@ private extern(C) void jtk_window_set_icon(ulong window, const ubyte * data,
|
||||
|
||||
class Window
|
||||
{
|
||||
private static Window[ulong] windows_by_id;
|
||||
private static Mutex windows_by_id_mutex;
|
||||
private static bool derelict_reloaded;
|
||||
private static __gshared Window[ulong] windows_by_id;
|
||||
private static __gshared Mutex windows_by_id_mutex;
|
||||
private static __gshared bool derelict_reloaded;
|
||||
private ulong m_window;
|
||||
|
||||
this()
|
||||
{
|
||||
if (!jtk_window_create(&m_window))
|
||||
{
|
||||
/* TODO */
|
||||
throw new Exception("Failed to create JTK window.");
|
||||
}
|
||||
if (!derelict_reloaded)
|
||||
{
|
||||
@ -68,7 +68,7 @@ class Window
|
||||
}
|
||||
catch (core.exception.RangeError re)
|
||||
{
|
||||
return null;
|
||||
throw new Exception("Could not find requested JTK window ID");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user