don't destroy app communication server in main() destructor
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 9 Mar 2010 04:54:40 +0000 (23:54 -0500)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 9 Mar 2010 04:59:59 +0000 (23:59 -0500)
When doing this, it is likely the listener thread will still
be running and printing errors because its fd's have been closed.
Instead, do the destruction in the listener app and cleanly
shut it down with pthread_cancel().

libust/tracectl.c

index 5d06f28264a18d4c69b991afbfd25f32700c4a90..2e9052386c7121131d91c0495522752c96a9b57b 100644 (file)
@@ -819,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";
@@ -1099,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) {
@@ -1125,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;
@@ -1385,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
@@ -1415,7 +1439,8 @@ static void __attribute__((destructor)) keepalive()
 
        destroy_traces();
 
-       ustcomm_fini_app(&ustcomm_app, 0);
+       /* Ask the listener to stop and clean up. */
+       stop_listener();
 }
 
 void ust_potential_exec(void)
This page took 0.024978 seconds and 4 git commands to generate.