From 88bef83d8ba630f573f41495b0e7ff5381a43047 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Fri, 29 Apr 2016 18:29:04 +0200
Subject: [PATCH] X threading handling

---
 common/utils/T/tracer/gui/gui.c  |  2 ++
 common/utils/T/tracer/gui/init.c |  2 ++
 common/utils/T/tracer/gui/x.c    | 17 +++++++++++++++++
 common/utils/T/tracer/gui/x.h    |  5 +++++
 4 files changed, 26 insertions(+)

diff --git a/common/utils/T/tracer/gui/gui.c b/common/utils/T/tracer/gui/gui.c
index 55c7a3680a..2166774d92 100644
--- a/common/utils/T/tracer/gui/gui.c
+++ b/common/utils/T/tracer/gui/gui.c
@@ -9,11 +9,13 @@ void glock(gui *_gui)
 {
   struct gui *g = _gui;
   if (pthread_mutex_lock(g->lock)) ERR("mutex error\n");
+  xlock(g->x);
 }
 
 void gunlock(gui *_gui)
 {
   struct gui *g = _gui;
+  xunlock(g->x);
   if (pthread_mutex_unlock(g->lock)) ERR("mutex error\n");
 }
 
diff --git a/common/utils/T/tracer/gui/init.c b/common/utils/T/tracer/gui/init.c
index c708639674..445f696643 100644
--- a/common/utils/T/tracer/gui/init.c
+++ b/common/utils/T/tracer/gui/init.c
@@ -12,6 +12,8 @@ gui *gui_init(void)
 {
   struct gui *ret;
 
+  x_init_threading();
+
   ret = calloc(1, sizeof(struct gui));
   if (ret == NULL) OOM;
 
diff --git a/common/utils/T/tracer/gui/x.c b/common/utils/T/tracer/gui/x.c
index 50164dce35..12888da468 100644
--- a/common/utils/T/tracer/gui/x.c
+++ b/common/utils/T/tracer/gui/x.c
@@ -6,6 +6,23 @@
 #include <stdlib.h>
 #include <string.h>
 
+void x_init_threading(void)
+{
+  if (XInitThreads() == False) abort();
+}
+
+void xlock(x_connection *_x)
+{
+  struct x_connection *x = _x;
+  XLockDisplay(x->d);
+}
+
+void xunlock(x_connection *_x)
+{
+  struct x_connection *x = _x;
+  XUnlockDisplay(x->d);
+}
+
 int x_connection_fd(x_connection *_x)
 {
   struct x_connection *x = _x;
diff --git a/common/utils/T/tracer/gui/x.h b/common/utils/T/tracer/gui/x.h
index c1f8d33d89..82e46cac9d 100644
--- a/common/utils/T/tracer/gui/x.h
+++ b/common/utils/T/tracer/gui/x.h
@@ -6,6 +6,11 @@
 typedef void x_connection;
 typedef void x_window;
 
+void x_init_threading(void);
+
+void xlock(x_connection *x);
+void xunlock(x_connection *x);
+
 x_connection *x_open(void);
 
 x_window *x_create_window(x_connection *x, int width, int height,
-- 
GitLab