fix destruction to free all memory
[ust.git] / libust / tracectl.c
index af0149a5cb82a9d41c59c253ff6343a5d7f2d028..3f2ee38cdb7357f0bc5b94dc093536ca87acb819 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,8 +27,7 @@
 #include <fcntl.h>
 #include <poll.h>
 #include <regex.h>
-
-#include <urcu-bp.h>
+#include <urcu/uatomic_arch.h>
 
 #include <ust/marker.h>
 #include <ust/tracectl.h>
@@ -125,15 +125,6 @@ static void print_markers(FILE *fp)
 
 static int init_socket(void);
 
-/* This needs to be called whenever a new thread is created. It notifies
- * liburcu of the new thread.
- */
-
-void ust_register_thread(void)
-{
-       rcu_register_thread();
-}
-
 int fd_notif = -1;
 void notif_cb(void)
 {
@@ -357,10 +348,7 @@ static int do_cmd_get_shmid(const char *recvbuf, struct ustcomm_source *src)
                }
        }
 
-       if(found) {
-               buffers_to_export--;
-       }
-       else {
+       if(!found) {
                ERR("channel not found (%s)", channel_and_cpu);
        }
 
@@ -695,6 +683,14 @@ static int do_cmd_get_subbuffer(const char *recvbuf, struct ustcomm_source *src)
 
                        list_add(&bc->list, &blocked_consumers);
 
+                       /* Being here is the proof the daemon has mapped the buffer in its
+                        * memory. We may now decrement buffers_to_export.
+                        */
+                       if(uatomic_read(&buf->consumed) == 0) {
+                               DBG("decrementing buffers_to_export");
+                               buffers_to_export--;
+                       }
+
                        break;
                }
        }
@@ -823,8 +819,6 @@ void *listener_main(void *p)
 {
        int result;
 
-       ust_register_thread();
-
        DBG("LISTENER");
 
        for(;;) {
@@ -1186,16 +1180,8 @@ static void __attribute__((constructor)) init()
         */
        pidunique = make_pidunique();
 
-       /* Initialize RCU in case the constructor order is not good. */
-       rcu_init();
-
-       /* It is important to do this before events start to be generated. */
-       ust_register_thread();
-
        DBG("Tracectl constructor");
 
-       /* Must create socket before signal handler to prevent races.
-         */
        result = init_socket();
        if(result == -1) {
                ERR("init_socket error");
@@ -1425,7 +1411,7 @@ static void __attribute__((destructor)) keepalive()
 
        destroy_traces();
 
-       ustcomm_fini_app(&ustcomm_app);
+       ustcomm_fini_app(&ustcomm_app, 0);
 }
 
 void ust_potential_exec(void)
@@ -1473,9 +1459,13 @@ static void ust_fork(void)
                list_del(&bc->list);
        }
 
+       /* free app, keeping socket file */
+       ustcomm_fini_app(&ustcomm_app, 1);
+
+       buffers_to_export = 0;
        have_listener = 0;
-       create_listener();
        init_socket();
+       create_listener();
        ltt_trace_setup("auto");
        result = ltt_trace_set_type("auto", "ustrelay");
        if(result < 0) {
This page took 0.02541 seconds and 4 git commands to generate.