ust_fork(): close the ustcomm_app socket in the child on fork()
[ust.git] / libust / tracectl.c
index 3cb86edc80180f535e8a5773d8413ee11032db64..848b272f77c5167de00828e88b67652472ada7f7 100644 (file)
@@ -357,10 +357,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 +692,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(atomic_long_read(&buf->consumed) == 0) {
+                               DBG("decrementing buffers_to_export");
+                               buffers_to_export--;
+                       }
+
                        break;
                }
        }
@@ -964,7 +969,7 @@ void *listener_main(void *p)
 
                        DBG("trace destroy");
 
-                       result = ltt_trace_destroy(trace_name);
+                       result = ltt_trace_destroy(trace_name, 0);
                        if(result < 0) {
                                ERR("ltt_trace_destroy failed");
                                return (void *)1;
@@ -1348,7 +1353,7 @@ static void destroy_traces(void)
                ERR("ltt_trace_stop error");
        }
 
-       result = ltt_trace_destroy("auto");
+       result = ltt_trace_destroy("auto", 0);
        if(result == -1) {
                ERR("ltt_trace_destroy error");
        }
@@ -1453,9 +1458,14 @@ static void ust_fork(void)
        struct blocked_consumer *deletable_bc = NULL;
        int result;
 
+       /* FIXME: technically, the locks could have been taken before the fork */
        DBG("ust: forking");
+
+       /* break lock if necessary */
+       ltt_unlock_traces();
+
        ltt_trace_stop("auto");
-       ltt_trace_destroy("auto");
+       ltt_trace_destroy("auto", 1);
        /* Delete all active connections */
        ustcomm_close_all_connections(&ustcomm_app.server);
 
@@ -1468,9 +1478,12 @@ static void ust_fork(void)
                list_del(&bc->list);
        }
 
+       ustcomm_free_app(&ustcomm_app);
+
+       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.024338 seconds and 4 git commands to generate.