Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Panozzo <giovanni@panozzo.it>2016-03-02 22:21:00 +0300
committerGiovanni Panozzo <giovanni@panozzo.it>2016-03-05 14:47:26 +0300
commit0dd8d708fc2d318d620b62447e1fcac640e7e75c (patch)
tree7c456a4ce50ffa790f91a25941a0af35bb2515d6 /remmina
parentbe11efdc61fbac3692090660aae923d9bf07ab5d (diff)
Use pthread condition to sync threads
Diffstat (limited to 'remmina')
-rw-r--r--remmina/src/remmina_masterthread_exec.c19
-rw-r--r--remmina/src/remmina_masterthread_exec.h3
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;