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 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();
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user