libust: improve cleanup on application end
[ust.git] / libust / tracectl.c
index 412cca2b1cfdb1b4969cbaeb030f170ae871b988..ee67daaac91fa99b6786c69bd8a3167712b535e8 100644 (file)
@@ -793,23 +793,6 @@ static int init_socket(void)
        return ustcomm_init_app(getpid(), &ustcomm_app);
 }
 
-/* FIXME: reenable this to delete socket file. */
-
-#if 0
-static void destroy_socket(void)
-{
-       int result;
-
-       if(mysocketfile[0] == '\0')
-               return;
-
-       result = unlink(mysocketfile);
-       if(result == -1) {
-               PERROR("unlink");
-       }
-}
-#endif
-
 static int init_signal_handler(void)
 {
        /* Attempt to handler SIGIO. If the main program wants to
@@ -1005,31 +988,34 @@ static void __attribute__((constructor(1000))) init()
 }
 
 /* This is only called if we terminate normally, not with an unhandled signal,
- * so we cannot rely on it. */
+ * so we cannot rely on it. However, for now, LTTV requires that the header of
+ * the last sub-buffer contain a valid end time for the trace. This is done
+ * automatically only when the trace is properly stopped.
+ *
+ * If the traced program crashed, it is always possible to manually add the
+ * right value in the header, or to open the trace in text mode.
+ *
+ * FIXME: Fix LTTV so it doesn't need this.
+ */
 
-/* This destructor probably isn't needed, because ustd can do crash recovery. */
-#if 0
-static void __attribute__((destructor)) fini()
+static void destroy_traces(void)
 {
-//     int result;
+       int result;
 
        /* if trace running, finish it */
 
-//     DBG("destructor stopping traces");
+       DBG("destructor stopping traces");
 
-//     result = ltt_trace_stop("auto");
-//     if(result == -1) {
-//             ERR("ltt_trace_stop error");
-//     }
-//
-//     result = ltt_trace_destroy("auto");
-//     if(result == -1) {
-//             ERR("ltt_trace_destroy error");
-//     }
-//
-//     destroy_socket();
+       result = ltt_trace_stop("auto");
+       if(result == -1) {
+               ERR("ltt_trace_stop error");
+       }
+
+       result = ltt_trace_destroy("auto");
+       if(result == -1) {
+               ERR("ltt_trace_destroy error");
+       }
 }
-#endif
 
 static int trace_recording(void)
 {
@@ -1099,6 +1085,10 @@ static void __attribute__((destructor)) keepalive()
                }
                DBG("Finally dying...");
        }
+
+       destroy_traces();
+
+       ustcomm_fini_app(&ustcomm_app);
 }
 
 /* Notify ust that there was a fork. This needs to be called inside
@@ -1109,14 +1099,35 @@ static void __attribute__((destructor)) keepalive()
 
 void ust_fork(void)
 {
+       struct blocked_consumer *bc;
+       struct blocked_consumer *deletable_bc = NULL;
+       int result;
+
        DBG("ust: forking");
        ltt_trace_stop("auto");
        ltt_trace_destroy("auto");
-       ltt_trace_alloc("auto");
-       ltt_trace_start("auto");
-       init_socket();
+       /* Delete all active connections */
+       ustcomm_close_all_connections(&ustcomm_app.server);
+
+       /* Delete all blocked consumers */
+       list_for_each_entry(bc, &blocked_consumers, list) {
+               free(deletable_bc);
+               deletable_bc = bc;
+               list_del(&bc->list);
+       }
+
        have_listener = 0;
        create_listener();
+       init_socket();
+       ltt_trace_setup("auto");
+       result = ltt_trace_set_type("auto", "ustrelay");
+       if(result < 0) {
+               ERR("ltt_trace_set_type failed");
+               return;
+       }
+
+       ltt_trace_alloc("auto");
+       ltt_trace_start("auto");
        inform_consumer_daemon("auto");
 }
 
This page took 0.023625 seconds and 4 git commands to generate.