jtk: Store event list as untranslated events from C to avoid threading issues.

This commit is contained in:
Josh Holtrop 2020-12-03 10:41:41 -05:00
parent 5385718e91
commit 97e4dde563
2 changed files with 16 additions and 17 deletions

View File

@ -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 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 event_list_mutex;
private __gshared Mutex wait_event_mutex; private __gshared Mutex wait_event_mutex;
private __gshared Condition wait_event_condition; private __gshared Condition wait_event_condition;
@ -87,21 +87,17 @@ class Event
private void event_thread() private void event_thread()
{ {
jtk_event_t c_event;
for (;;) for (;;)
{ {
jtk_event_t * c_event = new jtk_event_t;
ulong time_until_next_timer_expiry = Timer.time_to_next_timer_expiration(); 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; break;
} }
synchronized(event_list_mutex) synchronized(event_list_mutex)
{ {
Event event = c_event_to_event(&c_event); event_list.insertBack(c_event);
if (event !is null)
{
event_list.insertBack(event);
}
} }
synchronized(wait_event_mutex) synchronized(wait_event_mutex)
{ {
@ -153,7 +149,7 @@ private Event c_event_to_event(jtk_event_t * c_event)
package void event_init() package void event_init()
{ {
event_list = new DList!(Event); event_list = new DList!(jtk_event_t *);
event_list_mutex = new Mutex; event_list_mutex = new Mutex;
wait_event_mutex = new Mutex; wait_event_mutex = new Mutex;
wait_event_condition = new Condition(wait_event_mutex); wait_event_condition = new Condition(wait_event_mutex);
@ -166,7 +162,7 @@ Event check_event()
{ {
if (!event_list.empty) if (!event_list.empty)
{ {
Event rv = event_list.front; Event rv = c_event_to_event(event_list.front);
event_list.removeFront(); event_list.removeFront();
return rv; return rv;
} }
@ -184,9 +180,12 @@ Event wait_event()
{ {
if (!event_list.empty) if (!event_list.empty)
{ {
Event rv = event_list.front; Event rv = c_event_to_event(event_list.front);
event_list.removeFront(); event_list.removeFront();
return rv; if (rv !is null)
{
return rv;
}
} }
} }
wait_event_condition.wait(); wait_event_condition.wait();

View File

@ -14,16 +14,16 @@ private extern(C) void jtk_window_set_icon(ulong window, const ubyte * data,
class Window class Window
{ {
private static Window[ulong] windows_by_id; private static __gshared Window[ulong] windows_by_id;
private static Mutex windows_by_id_mutex; private static __gshared Mutex windows_by_id_mutex;
private static bool derelict_reloaded; private static __gshared bool derelict_reloaded;
private ulong m_window; private ulong m_window;
this() this()
{ {
if (!jtk_window_create(&m_window)) if (!jtk_window_create(&m_window))
{ {
/* TODO */ throw new Exception("Failed to create JTK window.");
} }
if (!derelict_reloaded) if (!derelict_reloaded)
{ {
@ -68,7 +68,7 @@ class Window
} }
catch (core.exception.RangeError re) catch (core.exception.RangeError re)
{ {
return null; throw new Exception("Could not find requested JTK window ID");
} }
} }
} }