summaryrefslogtreecommitdiffstats
path: root/src/daemon/purple.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/purple.c')
-rw-r--r--src/daemon/purple.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/daemon/purple.c b/src/daemon/purple.c
index 882ea61..fc4f49f 100644
--- a/src/daemon/purple.c
+++ b/src/daemon/purple.c
@@ -156,9 +156,11 @@ static void *purple_spawn(void *disregard)
char *user = NULL;
char *password = NULL;
char *proto = NULL;
+ int cancelstate;
(void) disregard;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelstate);
pthread_cleanup_push(pthread_mutex_unlock_thunk, &state.mutex);
progname = setting_progname();
@@ -203,8 +205,11 @@ static void *purple_spawn(void *disregard)
pthread_cleanup_push(purple_account_destroy_thunk, state.account);
- g_main_loop_run(loop);
pthread_cleanup_push(g_main_loop_quit_thunk, loop);
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &cancelstate);
+ pthread_testcancel();
+
+ g_main_loop_run(loop);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
@@ -246,9 +251,14 @@ int purple_init(void)
void purple_close(void)
{
+ int status;
+
+ status = pthread_mutex_trylock(&state.mutex);
- if (pthread_mutex_trylock(&state.mutex) == EBUSY) {
+ if (status == EBUSY) {
pthread_cancel(state.purple);
pthread_join(state.purple, NULL);
+ } else if (!status) {
+ pthread_mutex_unlock(&state.mutex);
}
}