don't destroy app communication server in main() destructor
[ust.git] / libust / tracectl.c
index 57218a6bd62765b217a27338104b1cbb88a21061..2e9052386c7121131d91c0495522752c96a9b57b 100644 (file)
@@ -17,6 +17,7 @@
 
 #define _GNU_SOURCE
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdint.h>
 #include <signal.h>
 #include <sys/types.h>
@@ -26,6 +27,7 @@
 #include <fcntl.h>
 #include <poll.h>
 #include <regex.h>
+#include <urcu/uatomic_arch.h>
 
 #include <ust/marker.h>
 #include <ust/tracectl.h>
@@ -230,9 +232,13 @@ void process_blocked_consumers(void)
                                continue;
                        }
                        if(result == 0) {
+                               int res;
                                DBG("PRODUCER END");
 
-                               close(bc->fd_producer);
+                               res = close(bc->fd_producer);
+                               if(res == -1) {
+                                       PERROR("close");
+                               }
 
                                list_del(&bc->list);
 
@@ -648,7 +654,7 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        if(trace == NULL) {
                int result;
 
-               WARN("Cannot find trace. It was likely destroyed by the user.");
+               DBG("Cannot find trace. It was likely destroyed by the user.");
                result = ustcomm_send_reply(&ustcomm_app.server, "NOTFOUND", src);
                if(result) {
                        ERR("ustcomm_send_reply failed");
@@ -684,7 +690,7 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
                        /* Being here is the proof the daemon has mapped the buffer in its
                         * memory. We may now decrement buffers_to_export.
                         */
-                       if(atomic_long_read(&buf->consumed) == 0) {
+                       if(uatomic_read(&buf->consumed) == 0) {
                                DBG("decrementing buffers_to_export");
                                buffers_to_export--;
                        }
@@ -755,7 +761,7 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        trace = _ltt_trace_find(trace_name);
 
        if(trace == NULL) {
-               WARN("Cannot find trace. It was likely destroyed by the user.");
+               DBG("Cannot find trace. It was likely destroyed by the user.");
                result = ustcomm_send_reply(&ustcomm_app.server, "NOTFOUND", src);
                if(result) {
                        ERR("ustcomm_send_reply failed");
@@ -813,12 +819,19 @@ static int do_cmd_put_subbuffer(const char *recvbuf, struct ustcomm_source *src)
        return retval;
 }
 
+static void listener_cleanup(void *ptr)
+{
+       ustcomm_fini_app(&ustcomm_app, 0);
+}
+
 void *listener_main(void *p)
 {
        int result;
 
        DBG("LISTENER");
 
+       pthread_cleanup_push(listener_cleanup, NULL);
+
        for(;;) {
                char trace_name[] = "auto";
                char trace_type[] = "ustrelay";
@@ -1093,17 +1106,20 @@ void *listener_main(void *p)
        next_cmd:
                free(recvbuf);
        }
+
+       pthread_cleanup_pop(1);
 }
 
 volatile sig_atomic_t have_listener = 0;
+#ifndef USE_CLONE
+static pthread_t listener_thread;
+#endif
 
 void create_listener(void)
 {
 #ifdef USE_CLONE
        static char listener_stack[16384];
        int result;
-#else
-       pthread_t thread;
 #endif
 
        if(have_listener) {
@@ -1119,7 +1135,7 @@ void create_listener(void)
        }
 #else
 
-       pthread_create(&thread, NULL, listener_main, NULL);
+       pthread_create(&listener_thread, NULL, listener_main, NULL);
 #endif
 
        have_listener = 1;
@@ -1379,6 +1395,20 @@ int restarting_usleep(useconds_t usecs)
        return result;
 }
 
+static void stop_listener()
+{
+       int result;
+
+       result = pthread_cancel(listener_thread);
+       if(result == -1) {
+               PERROR("pthread_cancel");
+       }
+       result = pthread_join(listener_thread, NULL);
+       if(result == -1) {
+               PERROR("pthread_join");
+       }
+}
+
 /* This destructor keeps the process alive for a few seconds in order
  * to leave time to ustd to connect to its buffers. This is necessary
  * for programs whose execution is very short. It is also useful in all
@@ -1409,7 +1439,8 @@ static void __attribute__((destructor)) keepalive()
 
        destroy_traces();
 
-       ustcomm_fini_app(&ustcomm_app);
+       /* Ask the listener to stop and clean up. */
+       stop_listener();
 }
 
 void ust_potential_exec(void)
@@ -1457,7 +1488,8 @@ static void ust_fork(void)
                list_del(&bc->list);
        }
 
-       ustcomm_free_app(&ustcomm_app);
+       /* free app, keeping socket file */
+       ustcomm_fini_app(&ustcomm_app, 1);
 
        buffers_to_export = 0;
        have_listener = 0;
This page took 0.02441 seconds and 4 git commands to generate.