diff options
author | Giovanni Panozzo <giovanni@panozzo.it> | 2016-03-02 22:21:00 +0300 |
---|---|---|
committer | Giovanni Panozzo <giovanni@panozzo.it> | 2016-03-05 14:47:26 +0300 |
commit | 0dd8d708fc2d318d620b62447e1fcac640e7e75c (patch) | |
tree | 7c456a4ce50ffa790f91a25941a0af35bb2515d6 /remmina | |
parent | be11efdc61fbac3692090660aae923d9bf07ab5d (diff) |
Use pthread condition to sync threads
Diffstat (limited to 'remmina')
-rw-r--r-- | remmina/src/remmina_masterthread_exec.c | 19 | ||||
-rw-r--r-- | remmina/src/remmina_masterthread_exec.h | 3 |
2 files changed, 12 insertions, 10 deletions
diff --git a/remmina/src/remmina_masterthread_exec.c b/remmina/src/remmina_masterthread_exec.c index 9a65b0fea..4b77141c4 100644 --- a/remmina/src/remmina_masterthread_exec.c +++ b/remmina/src/remmina_masterthread_exec.c @@ -38,11 +38,8 @@ #include <gtk/gtk.h> - - #include "remmina_masterthread_exec.h" - static pthread_t gMainThreadID; static gboolean remmina_masterthread_exec_callback(RemminaMTExecData *d) @@ -115,7 +112,9 @@ static gboolean remmina_masterthread_exec_callback(RemminaMTExecData *d) #endif break; } - pthread_mutex_unlock(&d->mu); + pthread_mutex_lock(&d->pt_mutex); + pthread_cond_signal(&d->pt_cond); + pthread_mutex_unlock(&d->pt_mutex); } else { @@ -133,15 +132,17 @@ static void remmina_masterthread_exec_cleanup_handler(gpointer data) void remmina_masterthread_exec_and_wait(RemminaMTExecData *d) { + int rc; d->cancelled = FALSE; pthread_cleanup_push(remmina_masterthread_exec_cleanup_handler, (void *)d); - pthread_mutex_init(&d->mu, NULL); - pthread_mutex_lock(&d->mu); + pthread_mutex_init(&d->pt_mutex, NULL); + pthread_cond_init(&d->pt_cond, NULL); gdk_threads_add_idle((GSourceFunc)remmina_masterthread_exec_callback, (gpointer)d); - pthread_mutex_lock(&d->mu); + pthread_mutex_lock(&d->pt_mutex); + pthread_cond_wait(&d->pt_cond, &d->pt_mutex); pthread_cleanup_pop(0); - pthread_mutex_unlock(&d->mu); - pthread_mutex_destroy(&d->mu); + pthread_mutex_destroy(&d->pt_mutex); + pthread_cond_destroy(&d->pt_cond); } void remmina_masterthread_exec_save_main_thread_id() diff --git a/remmina/src/remmina_masterthread_exec.h b/remmina/src/remmina_masterthread_exec.h index 4755f1b95..cf343c51c 100644 --- a/remmina/src/remmina_masterthread_exec.h +++ b/remmina/src/remmina_masterthread_exec.h @@ -158,7 +158,8 @@ typedef struct remmina_masterthread_exec_data } p; /* Mutex for thread synchronization */ - pthread_mutex_t mu; + pthread_mutex_t pt_mutex; + pthread_cond_t pt_cond; /* Flag to catch cancellations */ gboolean cancelled; |