Fix: deadlock between UST registry lock and consumer lock
[lttng-tools.git] / src / bin / lttng-sessiond / ust-consumer.c
index f120144aaaa994383fd96eea1af4d671cb78c960..611b54dcdb17d392f14bd42dc98320a0cb098b61 100644 (file)
@@ -448,12 +448,12 @@ int ust_consumer_metadata_request(struct consumer_socket *socket)
        assert(socket);
 
        rcu_read_lock();
-       pthread_mutex_lock(socket->lock);
-
        health_code_update();
 
        /* Wait for a metadata request */
+       pthread_mutex_lock(socket->lock);
        ret = consumer_socket_recv(socket, &request, sizeof(request));
+       pthread_mutex_unlock(socket->lock);
        if (ret < 0) {
                goto end;
        }
@@ -488,7 +488,9 @@ int ust_consumer_metadata_request(struct consumer_socket *socket)
        }
        assert(ust_reg);
 
+       pthread_mutex_lock(&ust_reg->lock);
        ret_push = ust_app_push_metadata(ust_reg, socket, 1);
+       pthread_mutex_unlock(&ust_reg->lock);
        if (ret_push < 0) {
                ERR("Pushing metadata");
                ret = -1;
@@ -498,7 +500,6 @@ int ust_consumer_metadata_request(struct consumer_socket *socket)
        ret = 0;
 
 end:
-       pthread_mutex_unlock(socket->lock);
        rcu_read_unlock();
        return ret;
 }
This page took 0.023524 seconds and 4 git commands to generate.