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 __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();
}
}

View File

@ -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");
}
}
}