fix destruction to free all memory
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 4 Mar 2010 21:11:20 +0000 (16:11 -0500)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 4 Mar 2010 21:11:20 +0000 (16:11 -0500)
libust/tracectl.c
libustcmd/ustcmd.c
libustcomm/ustcomm.c
libustcomm/ustcomm.h
ustd/ustd.c

index bafe1a94d5a56ac5e7b57f179f75aadbfd520201..3f2ee38cdb7357f0bc5b94dc093536ca87acb819 100644 (file)
@@ -1411,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)
@@ -1459,7 +1459,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;
index 930c078fcd9510aebad1eff190d0817a5280e092..7a05afa20079944b0ce3e79e60efcf06cc17f233 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "ustcomm.h"
 #include "ustcmd.h"
+#include "usterr.h"
 
 pid_t *ustcmd_get_online_pids(void)
 {
@@ -116,7 +117,7 @@ int ustcmd_set_subbuf_size(const char *channel_size, pid_t pid)
        asprintf(&cmd, "%s %s", "set_subbuf_size", channel_size);
 
        result = ustcmd_send_cmd(cmd, pid, NULL);
-       if (result) {
+       if (result != 1) {
                free(cmd);
                return 1;
        }
@@ -140,7 +141,7 @@ int ustcmd_set_subbuf_num(const char *channel_size, pid_t pid)
        asprintf(&cmd, "%s %s", "set_subbuf_num", channel_size);
 
        result = ustcmd_send_cmd(cmd, pid, NULL);
-       if (result) {
+       if (result != 1) {
                free(cmd);
                return 1;
        }
@@ -161,7 +162,7 @@ int ustcmd_destroy_trace(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("trace_destroy", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -179,7 +180,7 @@ int ustcmd_setup_and_start(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("start", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -197,7 +198,7 @@ int ustcmd_create_trace(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("trace_create", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -215,7 +216,7 @@ int ustcmd_start_trace(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("trace_start", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -233,7 +234,7 @@ int ustcmd_alloc_trace(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("trace_alloc", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -251,7 +252,7 @@ int ustcmd_stop_trace(pid_t pid)
        int result;
 
        result = ustcmd_send_cmd("trace_stop", pid, NULL);
-       if (result) {
+       if (result != 1) {
                return USTCMD_ERR_GEN;
        }
 
@@ -308,7 +309,7 @@ int ustcmd_free_cmsf(struct marker_status *cmsf)
  * @param cmsf Pointer to CMSF array to be filled (callee allocates, caller
  *             frees with `ustcmd_free_cmsf')
  * @param pid  Targeted PID
- * @return     0 if successful, or errors {USTCMD_ERR_ARG, USTCMD_ERR_GEN}
+ * @return     0 if successful, or -1 on error
  */
 int ustcmd_get_cmsf(struct marker_status **cmsf, const pid_t pid)
 {
@@ -318,22 +319,22 @@ int ustcmd_get_cmsf(struct marker_status **cmsf, const pid_t pid)
        unsigned int i = 0, cmsf_ind = 0;
 
        if (cmsf == NULL) {
-               return USTCMD_ERR_ARG;
+               return -1;
        }
        result = ustcmd_send_cmd("list_markers", pid, &big_str);
-       if (result) {
-               return USTCMD_ERR_GEN;
+       if (result != 1) {
+               return -1;
        }
 
-       if (big_str == NULL) {
-               fprintf(stderr, "ustcmd: error while getting markers list\n");
-               return USTCMD_ERR_GEN;
+       if (result != 1) {
+               ERR("error while getting markers list");
+               return -1;
        }
 
        tmp_cmsf = (struct marker_status *) malloc(sizeof(struct marker_status) *
                (ustcmd_count_nl(big_str) + 1));
        if (tmp_cmsf == NULL) {
-               return USTCMD_ERR_GEN;
+               return -1;
        }
 
        /* Parse received reply string (format: "[chan]/[mark] [st] [fs]"): */
@@ -365,30 +366,28 @@ int ustcmd_get_cmsf(struct marker_status **cmsf, const pid_t pid)
 }
 
 /**
- * Shoots a given command using ustcomm.
+ * Sends a given command to a traceable process
  *
- * @param cmd  Null-terminated command to shoot
+ * @param cmd  Null-terminated command to send
  * @param pid  Targeted PID
  * @param reply        Pointer to string to be filled with a reply string (must
  *             be NULL if no reply is needed for the given command).
- * @return     0 if successful, or errors {USTCMD_ERR_ARG, USTCMD_ERR_CONN}
+ * @return     -1 if successful, 0 on EOT, 1 on success
  */
 
 int ustcmd_send_cmd(const char *cmd, const pid_t pid, char **reply)
 {
        struct ustcomm_connection conn;
-
-       if (cmd == NULL) {
-               return USTCMD_ERR_ARG;
-       }
+       int retval;
 
        if (ustcomm_connect_app(pid, &conn)) {
-               fprintf(stderr, "ustcmd_send_cmd: could not connect to PID %u\n",
-                       (unsigned int) pid);
-               return USTCMD_ERR_CONN;
+               ERR("could not connect to PID %u", (unsigned int) pid);
+               return -1;
        }
 
-       ustcomm_send_request(&conn, cmd, reply);
+       retval = ustcomm_send_request(&conn, cmd, reply);
 
-       return 0;
+       ustcomm_close_app(&conn);
+
+       return retval;
 }
index 5f2517b169411dc24e2f66c6823962d629ebfdc4..60428df0553082bfaa35130b134008743421a202 100644 (file)
@@ -249,6 +249,7 @@ static int recv_message_fd(int fd, char **recv_buf, int *recv_buf_size, int *rec
 
                        if(i == 0) {
                                /* problem */
+                               WARN("received empty message");
                        }
                        *msg = strndup(*recv_buf, i);
 
@@ -321,7 +322,7 @@ int ustcomm_close_all_connections(struct ustcomm_server *server)
        list_for_each_entry(conn, &server->connections, list) {
                free(deletable_conn);
                deletable_conn = conn;
-               close(conn->fd);
+               ustcomm_close_app(conn);
                list_del(&conn->list);
        }
 
@@ -360,7 +361,8 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                conn_table = (struct ustcomm_connection **) malloc(n_fds * sizeof(struct ustcomm_connection *));
                if(conn_table == NULL) {
                        ERR("malloc returned NULL");
-                       return -1;
+                       retval = -1;
+                       goto free_fds_return;
                }
 
                /* special idx 0 is for listening socket */
@@ -379,11 +381,14 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                        /* nothing */;
                if(result == -1) {
                        PERROR("poll");
-                       return -1;
+                       retval = -1;
+                       goto free_conn_table_return;
                }
 
-               if(result == 0)
-                       return 0;
+               if(result == 0) {
+                       retval = 0;
+                       goto free_conn_table_return;
+               }
 
                if(fds[0].revents) {
                        struct ustcomm_connection *newconn;
@@ -392,7 +397,8 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                        result = newfd = accept(server->listen_fd, NULL, NULL);
                        if(result == -1) {
                                PERROR("accept");
-                               return -1;
+                               retval = -1;
+                               goto free_conn_table_return;
                        }
 
                        newconn = (struct ustcomm_connection *) malloc(sizeof(struct ustcomm_connection));
@@ -425,14 +431,17 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                                        }
                                }
                                else {
-                                       goto free_fds_return;
+                                       goto free_conn_table_return;
                                }
                        }
                }
 
                free(fds);
+               free(conn_table);
        }
 
+free_conn_table_return:
+       free(conn_table);
 free_fds_return:
        free(fds);
        return retval;
@@ -554,6 +563,11 @@ int ustcomm_send_request(struct ustcomm_connection *conn, const char *req, char
        return 1;
 }
 
+/* Return value:
+ *  0: success
+ * -1: error
+ */
+
 int ustcomm_connect_path(const char *path, struct ustcomm_connection *conn, pid_t signalpid)
 {
        int fd;
@@ -600,6 +614,13 @@ int ustcomm_disconnect(struct ustcomm_connection *conn)
        return close(conn->fd);
 }
 
+/* Open a connection to a traceable app.
+ *
+ * Return value:
+ *  0: success
+ * -1: error
+ */
+
 int ustcomm_connect_app(pid_t pid, struct ustcomm_connection *conn)
 {
        int result;
@@ -615,6 +636,16 @@ int ustcomm_connect_app(pid_t pid, struct ustcomm_connection *conn)
        return ustcomm_connect_path(path, conn, pid);
 }
 
+/* Close a connection to a traceable app. */
+
+int ustcomm_close_app(struct ustcomm_connection *conn)
+{
+       close(conn->fd);
+       free(conn->recv_buf);
+
+       return 0;
+}
+
 static int ensure_dir_exists(const char *dir)
 {
        struct stat st;
@@ -678,16 +709,6 @@ free_name:
        return -1;
 }
 
-void ustcomm_free_app(struct ustcomm_app *app)
-{
-       int result;
-       result = close(app->server.listen_fd);
-       if(result == -1) {
-               PERROR("close");
-               return;
-       }
-}
-
 /* Used by the daemon to initialize its server so applications
  * can connect to it.
  */
@@ -728,31 +749,51 @@ free_name:
        return retval;
 }
 
-void ustcomm_fini_app(struct ustcomm_app *handle)
+static void ustcomm_fini_server(struct ustcomm_server *server, int keep_socket_file)
 {
        int result;
        struct stat st;
 
-       /* Destroy socket */
-       result = stat(handle->server.socketpath, &st);
-       if(result == -1) {
-               PERROR("stat (%s)", handle->server.socketpath);
-               return;
-       }
+       if(!keep_socket_file) {
+               /* Destroy socket */
+               result = stat(server->socketpath, &st);
+               if(result == -1) {
+                       PERROR("stat (%s)", server->socketpath);
+                       return;
+               }
 
-       /* Paranoid check before deleting. */
-       result = S_ISSOCK(st.st_mode);
-       if(!result) {
-               ERR("The socket we are about to delete is not a socket.");
-               return;
+               /* Paranoid check before deleting. */
+               result = S_ISSOCK(st.st_mode);
+               if(!result) {
+                       ERR("The socket we are about to delete is not a socket.");
+                       return;
+               }
+
+               result = unlink(server->socketpath);
+               if(result == -1) {
+                       PERROR("unlink");
+               }
        }
 
-       result = unlink(handle->server.socketpath);
+       free(server->socketpath);
+
+       result = close(server->listen_fd);
        if(result == -1) {
-               PERROR("unlink");
+               PERROR("close");
+               return;
        }
 }
 
+void ustcomm_fini_app(struct ustcomm_app *handle, int keep_socket_file)
+{
+       ustcomm_fini_server(&handle->server, keep_socket_file);
+}
+
+void ustcomm_fini_ustd(struct ustcomm_ustd *handle)
+{
+       ustcomm_fini_server(&handle->server, 0);
+}
+
 static const char *find_tok(const char *str)
 {
        while(*str == ' ') {
index 05d90ebc0f02c2bd2634024d6824f398b098e77b..7eb8df69ff4591a2f6dba5199015698afc60862f 100644 (file)
@@ -67,12 +67,13 @@ extern int ustcomm_ustd_recv_message(struct ustcomm_ustd *ustd, char **msg, stru
 extern int ustcomm_app_recv_message(struct ustcomm_app *app, char **msg, struct ustcomm_source *src, int timeout);
 
 extern int ustcomm_init_app(pid_t pid, struct ustcomm_app *handle);
-extern void ustcomm_fini_app(struct ustcomm_app *handle);
+extern void ustcomm_fini_app(struct ustcomm_app *handle, int keep_socket_file);
 extern void ustcomm_free_app(struct ustcomm_app *app);
 
 extern int ustcomm_init_ustd(struct ustcomm_ustd *handle, const char *sock_path);
 
 extern int ustcomm_connect_app(pid_t pid, struct ustcomm_connection *conn);
+extern int ustcomm_close_app(struct ustcomm_connection *conn);
 extern int ustcomm_connect_path(const char *path, struct ustcomm_connection *conn, pid_t signalpid);
 extern int ustcomm_send_request(struct ustcomm_connection *conn, const char *req, char **reply);
 extern int ustcomm_send_reply(struct ustcomm_server *server, char *msg, struct ustcomm_source *src);
index f3285f58ba534d8c82c7f80677f5eba5f32de85d..4db550222407ba7d0773aa8b15e1b33cda777de2 100644 (file)
@@ -674,6 +674,11 @@ int start_ustd(int fd)
                PERROR("sigaction");
                return 1;
        }
+       result = sigaction(SIGINT, &sa, NULL);
+       if(result == -1) {
+               PERROR("sigaction");
+               return 1;
+       }
 
        result = ustcomm_init_ustd(&ustd, sock_path);
        if(result == -1) {
@@ -756,6 +761,9 @@ int start_ustd(int fd)
                                free_bufname:
                                free(bufname);
                        }
+                       else {
+                               WARN("unknown command: %s", recvbuf);
+                       }
 
                        free(recvbuf);
                }
@@ -772,6 +780,8 @@ int start_ustd(int fd)
                }
        }
 
+       ustcomm_fini_ustd(&ustd);
+
        return 0;
 }
 
This page took 0.030345 seconds and 4 git commands to generate.