Fix: application exit race with pthread cancel
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index 50e767654470c3d143b54eebe881a5b923b629ed..d48cc33627af5f4057060208e69b58afcdfc0b1f 100644 (file)
@@ -111,8 +111,15 @@ static int lttng_ust_comm_should_quit;
 int ust_lock(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_ENABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
        if (ret) {
@@ -140,8 +147,15 @@ int ust_lock(void)
 void ust_lock_nocheck(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_ENABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
        if (ret) {
@@ -161,7 +175,7 @@ void ust_lock_nocheck(void)
 void ust_unlock(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
@@ -174,6 +188,13 @@ void ust_unlock(void)
        if (ret) {
                ERR("pthread_sigmask: %s", strerror(ret));
        }
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_DISABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
 }
 
 /*
@@ -1556,9 +1577,7 @@ static
 void lttng_ust_cleanup(int exiting)
 {
        cleanup_sock_info(&global_apps, exiting);
-       if (local_apps.allowed) {
-               cleanup_sock_info(&local_apps, exiting);
-       }
+       cleanup_sock_info(&local_apps, exiting);
        /*
         * The teardown in this function all affect data structures
         * accessed under the UST lock by the listener thread. This
This page took 0.024402 seconds and 4 git commands to generate.