From 97e4dde563c5564c9578327da8a0fe036dfd118a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 3 Dec 2020 10:41:41 -0500 Subject: [PATCH] jtk: Store event list as untranslated events from C to avoid threading issues. --- src/jtk/event.d | 23 +++++++++++------------ src/jtk/window.d | 10 +++++----- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/jtk/event.d b/src/jtk/event.d index 30c48fc..d49ac45 100644 --- a/src/jtk/event.d +++ b/src/jtk/event.d @@ -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,9 +180,12 @@ Event wait_event() { if (!event_list.empty) { - Event rv = event_list.front; + Event rv = c_event_to_event(event_list.front); event_list.removeFront(); - return rv; + if (rv !is null) + { + return rv; + } } } wait_event_condition.wait(); diff --git a/src/jtk/window.d b/src/jtk/window.d index 6a6dce4..d689ec8 100644 --- a/src/jtk/window.d +++ b/src/jtk/window.d @@ -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"); } } }