diff options
Diffstat (limited to 'src/daemon/purple.c')
-rw-r--r-- | src/daemon/purple.c | 14 |
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); } } |