Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
* [ltt-dev] [UST PATCH] libustctl: use direct socket communication
@ 2011-02-24 12:26 Nils Carlson
  2011-02-24 12:33 ` Mathieu Desnoyers
       [not found] ` <BLU0-SMTP78C50A8553DE923A970DA096DA0@phx.gbl>
  0 siblings, 2 replies; 3+ messages in thread
From: Nils Carlson @ 2011-02-24 12:26 UTC (permalink / raw)


This patch changes libustctl to be socket instead of pid oriented.
The user is expected to connect to a pid using
ustctl_connect_pid(pid_t) which returns a socket file-descriptor and
then use the socket for the rest of the api. This reduces the amount
of open and closing systemcalls and also makes it possible for a
session daemon to detect process shutdown by the socket closing.

David, this ones for you. :-)

Signed-off-by: Nils Carlson <nils.carlson at ericsson.com>
---
 include/ust/ustctl.h                               |   66 ++++++---
 libustctl/libustctl.c                              |  150 +++++++++-----------
 .../libustctl_function_tests.c                     |   58 ++++----
 ustctl/channel_cmds.c                              |   42 +++---
 ustctl/marker_cmds.c                               |   35 ++---
 ustctl/scanning_functions.c                        |   11 ++-
 ustctl/scanning_functions.h                        |    2 +-
 ustctl/trace_cmds.c                                |   48 +++---
 ustctl/ustctl.c                                    |   31 ++--
 9 files changed, 229 insertions(+), 214 deletions(-)

diff --git a/include/ust/ustctl.h b/include/ust/ustctl.h
index 195ee26..35f7617 100644
--- a/include/ust/ustctl.h
+++ b/include/ust/ustctl.h
@@ -48,29 +48,51 @@ struct trace_event_status {
 };
 
 extern pid_t *ustctl_get_online_pids(void);
-extern int ustctl_set_marker_state(const char *trace, const char *channel,
-				   const char *marker, int state, pid_t pid);
-extern int ustctl_set_subbuf_size(const char *trace, const char *channel,
-				  unsigned int subbuf_size, pid_t pid);
-extern int ustctl_set_subbuf_num(const char *trace, const char *channel,
-				 unsigned int num, pid_t pid);
-extern int ustctl_get_subbuf_size(const char *trace, const char *channel,
-				  pid_t pid);
-extern int ustctl_get_subbuf_num(const char *trace, const char *channel,
-				 pid_t pid);
-extern int ustctl_destroy_trace(const char *trace, pid_t pid);
-extern int ustctl_setup_and_start(const char *trace, pid_t pid);
-extern int ustctl_stop_trace(const char *trace, pid_t pid);
-extern int ustctl_create_trace(const char *trace, pid_t pid);
-extern int ustctl_start_trace(const char *trace, pid_t pid);
-extern int ustctl_alloc_trace(const char *trace, pid_t pid);
+
+extern int ustctl_connect_pid(pid_t pid);
+
+extern int ustctl_set_marker_state(int sock, const char *trace,
+				   const char *channel, const char *marker,
+				   int state);
+
+extern int ustctl_set_subbuf_size(int sock, const char *trace,
+				  const char *channel,
+				  unsigned int subbuf_size);
+
+extern int ustctl_set_subbuf_num(int sock, const char *trace,
+				 const char *channel,
+				 unsigned int num);
+
+extern int ustctl_get_subbuf_size(int sock, const char *trace,
+				  const char *channel);
+
+extern int ustctl_get_subbuf_num(pid_t pid, const char *trace,
+				 const char *channel);
+
+extern int ustctl_destroy_trace(int sock, const char *trace);
+
+extern int ustctl_setup_and_start(int sock, const char *trace);
+
+extern int ustctl_stop_trace(int sock, const char *trace);
+
+extern int ustctl_create_trace(int sock, const char *trace);
+
+extern int ustctl_start_trace(int sock, const char *trace);
+
+extern int ustctl_alloc_trace(int sock, const char *trace);
+
 extern int ustctl_free_cmsf(struct marker_status *);
-extern unsigned int ustctl_count_nl(const char *);
-extern int ustctl_get_cmsf(struct marker_status **, pid_t);
 extern int ustctl_free_tes(struct trace_event_status *);
-extern int ustctl_get_tes(struct trace_event_status **, pid_t);
-extern int ustctl_set_sock_path(const char *sock_path, pid_t pid);
-extern int ustctl_get_sock_path(char **sock_path, pid_t pid);
-extern int ustctl_force_switch(pid_t pid);
+extern unsigned int ustctl_count_nl(const char *);
+
+extern int ustctl_get_cmsf(int sock, struct marker_status **);
+
+extern int ustctl_get_tes(int sock, struct trace_event_status **);
+
+extern int ustctl_set_sock_path(int sock, const char *sock_path);
+
+extern int ustctl_get_sock_path(int sock, char **sock_path);
+
+extern int ustctl_force_switch(int sock, const char *trace);
 
 #endif /* _USTCTL_H */
diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c
index 9c4ced2..e9709c5 100644
--- a/libustctl/libustctl.c
+++ b/libustctl/libustctl.c
@@ -1,4 +1,5 @@
 /* Copyright (C) 2009  Pierre-Marc Fournier, Philippe Proulx-Barrette
+ * Copyright (C) 2011  Ericsson AB
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,28 +29,22 @@
 #include "ust/ustctl.h"
 #include "usterr.h"
 
-static int do_cmd(const pid_t pid,
+static int do_cmd(int sock,
 		  const struct ustcomm_header *req_header,
 		  const char *req_data,
 		  struct ustcomm_header *res_header,
 		  char **res_data)
 {
-	int app_fd, result, saved_errno = 0;
+	int result, saved_errno = 0;
 	char *recv_buf;
 
-	if (ustcomm_connect_app(pid, &app_fd)) {
-		ERR("could not connect to PID %u", (unsigned int) pid);
-		errno = ENOTCONN;
-		return -1;
-	}
-
 	recv_buf = zmalloc(USTCOMM_BUFFER_SIZE);
 	if (!recv_buf) {
 		saved_errno = ENOMEM;
-		goto close_app_fd;
+		goto out;
 	}
 
-	result = ustcomm_req(app_fd, req_header, req_data, res_header, recv_buf);
+	result = ustcomm_req(sock, req_header, req_data, res_header, recv_buf);
 	if (result > 0) {
 		saved_errno = -res_header->result;
 		if (res_header->size == 0 || saved_errno > 0) {
@@ -71,11 +66,8 @@ static int do_cmd(const pid_t pid,
 		free(recv_buf);
 	}
 
-close_app_fd:
-	close(app_fd);
-
+out:
 	errno = saved_errno;
-
 	if (errno) {
 		return -1;
 	}
@@ -83,6 +75,19 @@ close_app_fd:
 	return 0;
 }
 
+int ustctl_connect_pid(pid_t pid)
+{
+	int sock;
+
+	if (ustcomm_connect_app(pid, &sock)) {
+		ERR("could not connect to PID %u", (unsigned int) pid);
+		errno = ENOTCONN;
+		return -1;
+	}
+
+	return sock;
+}
+
 pid_t *ustctl_get_online_pids(void)
 {
 	struct dirent *dirent;
@@ -140,8 +145,8 @@ pid_t *ustctl_get_online_pids(void)
  * @param pid	Traced process ID
  * @return	0 if successful, or errors {USTCTL_ERR_GEN, USTCTL_ERR_ARG}
  */
-int ustctl_set_marker_state(const char *trace, const char *channel,
-			    const char *marker, int state, pid_t pid)
+int ustctl_set_marker_state(int sock, const char *trace, const char *channel,
+			    const char *marker, int state)
 {
 	struct ustcomm_header req_header, res_header;
 	struct ustcomm_marker_info marker_inf;
@@ -159,7 +164,7 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
 
 	req_header.command = state ? ENABLE_MARKER : DISABLE_MARKER;
 
-	return do_cmd(pid, &req_header, (char *)&marker_inf,
+	return do_cmd(sock, &req_header, (char *)&marker_inf,
 		      &res_header, NULL);
 }
 
@@ -170,8 +175,8 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
  * @param pid		Traced process ID
  * @return		0 if successful, or error
  */
-int ustctl_set_subbuf_size(const char *trace, const char *channel,
-			   unsigned int subbuf_size, pid_t pid)
+int ustctl_set_subbuf_size(int sock, const char *trace, const char *channel,
+			   unsigned int subbuf_size)
 {
 	struct ustcomm_header req_header, res_header;
 	struct ustcomm_channel_info ch_inf;
@@ -189,7 +194,7 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
 	req_header.command = SET_SUBBUF_SIZE;
 	ch_inf.subbuf_size = subbuf_size;
 
-	return do_cmd(pid, &req_header, (char *)&ch_inf,
+	return do_cmd(sock, &req_header, (char *)&ch_inf,
 		      &res_header, NULL);
 }
 
@@ -200,8 +205,8 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
  * @param pid		Traced process ID
  * @return		0 if successful, or error
  */
-int ustctl_set_subbuf_num(const char *trace, const char *channel,
-			  unsigned int num, pid_t pid)
+int ustctl_set_subbuf_num(int sock, const char *trace, const char *channel,
+			  unsigned int num)
 {
 	struct ustcomm_header req_header, res_header;
 	struct ustcomm_channel_info ch_inf;
@@ -219,13 +224,14 @@ int ustctl_set_subbuf_num(const char *trace, const char *channel,
 	req_header.command = SET_SUBBUF_NUM;
 	ch_inf.subbuf_num = num;
 
-	return do_cmd(pid, &req_header, (char *)&ch_inf,
+	return do_cmd(sock, &req_header, (char *)&ch_inf,
 		      &res_header, NULL);
 
 }
 
-static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
-				      pid_t pid, int *num, int *size)
+
+static int ustctl_get_subbuf_num_size(int sock, const char *trace, const char *channel,
+				      int *num, int *size)
 {
 	struct ustcomm_header req_header, res_header;
 	struct ustcomm_channel_info ch_inf, *ch_inf_res;
@@ -243,7 +249,7 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
 
 	req_header.command = GET_SUBBUF_NUM_SIZE;
 
-	result = do_cmd(pid, &req_header, (char *)&ch_inf,
+	result = do_cmd(sock, &req_header, (char *)&ch_inf,
 			&res_header, (char **)&ch_inf_res);
 	if (result < 0) {
 		return -1;
@@ -264,11 +270,11 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
  * @param pid		Traced process ID
  * @return		subbuf cnf if successful, or error
  */
-int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
+int ustctl_get_subbuf_num(int sock, const char *trace, const char *channel)
 {
 	int num, size, result;
 
-	result = ustctl_get_subbuf_num_size(trace, channel, pid,
+	result = ustctl_get_subbuf_num_size(sock, trace, channel,
 					    &num, &size);
 	if (result < 0) {
 		errno = -result;
@@ -285,11 +291,11 @@ int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
  * @param pid		Traced process ID
  * @return		subbuf size if successful, or error
  */
-int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
+int ustctl_get_subbuf_size(int sock, const char *trace, const char *channel)
 {
 	int num, size, result;
 
-	result = ustctl_get_subbuf_num_size(trace, channel, pid,
+	result = ustctl_get_subbuf_num_size(sock, trace, channel,
 					    &num, &size);
 	if (result < 0) {
 		errno = -result;
@@ -299,8 +305,7 @@ int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
 	return size;
 }
 
-
-static int do_trace_cmd(const char *trace, pid_t pid, int command)
+static int do_trace_cmd(int sock, const char *trace, int command)
 {
 	struct ustcomm_header req_header, res_header;
 	struct ustcomm_single_field trace_inf;
@@ -316,7 +321,7 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
 
 	req_header.command = command;
 
-	return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL);
+	return do_cmd(sock, &req_header, (char *)&trace_inf, &res_header, NULL);
 }
 
 /**
@@ -325,9 +330,9 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_destroy_trace(const char *trace, pid_t pid)
+int ustctl_destroy_trace(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, DESTROY_TRACE);
+	return do_trace_cmd(sock, trace, DESTROY_TRACE);
 }
 
 /**
@@ -336,9 +341,9 @@ int ustctl_destroy_trace(const char *trace, pid_t pid)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_setup_and_start(const char *trace, pid_t pid)
+int ustctl_setup_and_start(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, START);
+	return do_trace_cmd(sock, trace, START);
 }
 
 /**
@@ -347,9 +352,9 @@ int ustctl_setup_and_start(const char *trace, pid_t pid)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_create_trace(const char *trace, pid_t pid)
+int ustctl_create_trace(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, CREATE_TRACE);
+	return do_trace_cmd(sock, trace, CREATE_TRACE);
 }
 
 /**
@@ -358,9 +363,9 @@ int ustctl_create_trace(const char *trace, pid_t pid)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_start_trace(const char *trace, pid_t pid)
+int ustctl_start_trace(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, START_TRACE);
+	return do_trace_cmd(sock, trace, START_TRACE);
 }
 
 /**
@@ -369,9 +374,9 @@ int ustctl_start_trace(const char *trace, pid_t pid)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_alloc_trace(const char *trace, pid_t pid)
+int ustctl_alloc_trace(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, ALLOC_TRACE);
+	return do_trace_cmd(sock, trace, ALLOC_TRACE);
 }
 
 /**
@@ -380,9 +385,9 @@ int ustctl_alloc_trace(const char *trace, pid_t pid)
  * @param pid	Traced process ID
  * @return	0 if successful, or error USTCTL_ERR_GEN
  */
-int ustctl_stop_trace(const char *trace, pid_t pid)
+int ustctl_stop_trace(int sock, const char *trace)
 {
-	return do_trace_cmd(trace, pid, STOP_TRACE);
+	return do_trace_cmd(sock, trace, STOP_TRACE);
 }
 
 /**
@@ -437,11 +442,11 @@ int ustctl_free_cmsf(struct marker_status *cmsf)
  * @param pid	Targeted PID
  * @return	0 if successful, or -1 on error
  */
-int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
+int ustctl_get_cmsf(int sock, struct marker_status **cmsf)
 {
 	struct ustcomm_header req_header, res_header;
 	char *big_str = NULL;
-	int result, app_fd;
+	int result;
 	struct marker_status *tmp_cmsf = NULL;
 	unsigned int i = 0, cmsf_ind = 0;
 
@@ -449,28 +454,21 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
 		return -1;
 	}
 
-	if (ustcomm_connect_app(pid, &app_fd)) {
-		ERR("could not connect to PID %u", (unsigned int) pid);
-		return -1;
-	}
-
 	req_header.command = LIST_MARKERS;
 	req_header.size = 0;
 
-	result = ustcomm_send(app_fd, &req_header, NULL);
+	result = ustcomm_send(sock, &req_header, NULL);
 	if (result <= 0) {
-		PERROR("error while requesting markers list for process %d", pid);
+		PERROR("error while requesting markers list");
 		return -1;
 	}
 
-	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
+	result = ustcomm_recv_alloc(sock, &res_header, &big_str);
 	if (result <= 0) {
 		ERR("error while receiving markers list");
 		return -1;
 	}
 
-	close(app_fd);
-
 	tmp_cmsf = (struct marker_status *) zmalloc(sizeof(struct marker_status) *
 						    (ustctl_count_nl(big_str) + 1));
 	if (tmp_cmsf == NULL) {
@@ -506,7 +504,6 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
 	return 0;
 }
 
-
 /**
  * Frees a TES array.
  *
@@ -537,12 +534,11 @@ int ustctl_free_tes(struct trace_event_status *tes)
  * @param pid	Targeted PID
  * @return	0 if successful, or -1 on error
  */
-int ustctl_get_tes(struct trace_event_status **tes,
-		   const pid_t pid)
+int ustctl_get_tes(int sock, struct trace_event_status **tes)
 {
 	struct ustcomm_header req_header, res_header;
 	char *big_str = NULL;
-	int result, app_fd;
+	int result;
 	struct trace_event_status *tmp_tes = NULL;
 	unsigned int i = 0, tes_ind = 0;
 
@@ -550,28 +546,21 @@ int ustctl_get_tes(struct trace_event_status **tes,
 		return -1;
 	}
 
-	if (ustcomm_connect_app(pid, &app_fd)) {
-		ERR("could not connect to PID %u", (unsigned int) pid);
-		return -1;
-	}
-
 	req_header.command = LIST_TRACE_EVENTS;
 	req_header.size = 0;
 
-	result = ustcomm_send(app_fd, &req_header, NULL);
+	result = ustcomm_send(sock, &req_header, NULL);
 	if (result != 1) {
 		ERR("error while requesting trace_event list");
 		return -1;
 	}
 
-	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
+	result = ustcomm_recv_alloc(sock, &res_header, &big_str);
 	if (result != 1) {
 		ERR("error while receiving markers list");
 		return -1;
 	}
 
-	close(app_fd);
-
 	tmp_tes = (struct trace_event_status *)
 		zmalloc(sizeof(struct trace_event_status) *
 			(ustctl_count_nl(big_str) + 1));
@@ -599,13 +588,13 @@ int ustctl_get_tes(struct trace_event_status **tes,
 }
 
 /**
- * Set socket path
+ * Set sock path
  *
- * @param sock_path	Socket path
+ * @param sock_path	Sock path
  * @param pid		Traced process ID
  * @return		0 if successful, or error
  */
-int ustctl_set_sock_path(const char *sock_path, pid_t pid)
+int ustctl_set_sock_path(int sock, const char *sock_path)
 {
 	int result;
 	struct ustcomm_header req_header, res_header;
@@ -621,18 +610,18 @@ int ustctl_set_sock_path(const char *sock_path, pid_t pid)
 
 	req_header.command = SET_SOCK_PATH;
 
-	return do_cmd(pid, &req_header, (char *)&sock_path_msg,
+	return do_cmd(sock, &req_header, (char *)&sock_path_msg,
 		      &res_header, NULL);
 }
 
 /**
- * Get socket path
+ * Get sock path
  *
- * @param sock_path	Pointer to where the socket path will be returned
+ * @param sock_path	Pointer to where the sock path will be returned
  * @param pid		Traced process ID
  * @return		0 if successful, or error
  */
-int ustctl_get_sock_path(char **sock_path, pid_t pid)
+int ustctl_get_sock_path(int sock, char **sock_path)
 {
 	int result;
 	struct ustcomm_header req_header, res_header;
@@ -641,7 +630,7 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
 	req_header.command = GET_SOCK_PATH;
 	req_header.size = 0;
 
-	result = do_cmd(pid, &req_header, NULL, &res_header,
+	result = do_cmd(sock, &req_header, NULL, &res_header,
 			(char **)&sock_path_msg);
 	if (result < 0) {
 		return -1;
@@ -659,13 +648,12 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
 	return 0;
 }
 
-int ustctl_force_switch(pid_t pid)
+int ustctl_force_switch(int sock, const char *trace)
 {
 	struct ustcomm_header req_header, res_header;
 
 	req_header.command = FORCE_SUBBUF_SWITCH;
 	req_header.size = 0;
 
-	return do_cmd(pid, &req_header, NULL, &res_header, NULL);
+	return do_cmd(sock, &req_header, NULL, &res_header, NULL);
 }
-
diff --git a/tests/libustctl_function_tests/libustctl_function_tests.c b/tests/libustctl_function_tests/libustctl_function_tests.c
index 1461997..7406243 100644
--- a/tests/libustctl_function_tests/libustctl_function_tests.c
+++ b/tests/libustctl_function_tests/libustctl_function_tests.c
@@ -30,7 +30,7 @@
 
 static void ustctl_function_tests(pid_t pid)
 {
-	int result;
+	int result, sock;
 	unsigned int subbuf_size, subbuf_num;
 	unsigned int new_subbuf_size, new_subbuf_num;
 	struct marker_status *marker_status, *ms_ptr;
@@ -40,8 +40,11 @@ static void ustctl_function_tests(pid_t pid)
 
 	printf("Connecting to pid %d\n", pid);
 
+	sock = ustctl_connect_pid(pid);
+	tap_ok(sock > 0, "ustctl_connect_pid");
+
 	/* marker status array functions */
-	result = ustctl_get_cmsf(&marker_status, pid);
+	result = ustctl_get_cmsf(sock, &marker_status);
 	tap_ok(!result, "ustctl_get_cmsf");
 
 	result = 0;
@@ -56,15 +59,15 @@ static void ustctl_function_tests(pid_t pid)
 	tap_ok(!ustctl_free_cmsf(marker_status), "ustctl_free_cmsf");
 
 	/* Get and set the socket path */
-	tap_ok(!ustctl_get_sock_path(&old_socket_path, pid),
+	tap_ok(!ustctl_get_sock_path(sock, &old_socket_path),
 	       "ustctl_get_sock_path");
 
 	printf("Socket path: %s\n", old_socket_path);
 
-	tap_ok(!ustctl_set_sock_path(tmp_ustd_socket, pid),
+	tap_ok(!ustctl_set_sock_path(sock, tmp_ustd_socket),
 	       "ustctl_set_sock_path - set a new path");
 
-	tap_ok(!ustctl_get_sock_path(&new_socket_path, pid),
+	tap_ok(!ustctl_get_sock_path(sock, &new_socket_path),
 	       "ustctl_get_sock_path - get the new path");
 
 	tap_ok(!strcmp(new_socket_path, tmp_ustd_socket),
@@ -72,90 +75,91 @@ static void ustctl_function_tests(pid_t pid)
 
 	free(new_socket_path);
 
-	tap_ok(!ustctl_set_sock_path(old_socket_path, pid),
+	tap_ok(!ustctl_set_sock_path(sock, old_socket_path),
 	       "Reset the socket path");
 
 	free(old_socket_path);
 
 	/* Enable, disable markers */
-	tap_ok(!ustctl_set_marker_state(trace, "ust", "bar", 1, pid),
+	tap_ok(!ustctl_set_marker_state(sock, trace, "ust", "bar", 1),
 	       "ustctl_set_marker_state - existing marker ust bar");
 
 	/* Create and allocate a trace */
-	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace");
+	tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace");
 
-	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace");
+	tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace");
 
 	/* Get subbuf size and number */
-	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
+	subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
 	tap_ok(subbuf_num > 0, "ustctl_get_subbuf_num - %d sub-buffers",
 	       subbuf_num);
 
-	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
+	subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
 	tap_ok(subbuf_size, "ustctl_get_subbuf_size - sub-buffer size is %d",
 	       subbuf_size);
 
 	/* Start the trace */
-	tap_ok(!ustctl_start_trace(trace, pid), "ustctl_start_trace");
+	tap_ok(!ustctl_start_trace(sock, trace), "ustctl_start_trace");
 
 
 	/* Stop the trace and destroy it*/
-	tap_ok(!ustctl_stop_trace(trace, pid), "ustctl_stop_trace");
+	tap_ok(!ustctl_stop_trace(sock, trace), "ustctl_stop_trace");
 
-	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace");
+	tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace");
 
 	/* Create a new trace */
-	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace - create a new trace");
+	tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace - create a new trace");
 
 	printf("Setting new subbufer number and sizes (doubling)\n");
 	new_subbuf_num = 2 * subbuf_num;
 	new_subbuf_size = 2 * subbuf_size;
 
-	tap_ok(!ustctl_set_subbuf_num(trace, "ust", new_subbuf_num, pid),
+	tap_ok(!ustctl_set_subbuf_num(sock, trace, "ust", new_subbuf_num),
 	       "ustctl_set_subbuf_num");
 
-	tap_ok(!ustctl_set_subbuf_size(trace, "ust", new_subbuf_size, pid),
+	tap_ok(!ustctl_set_subbuf_size(sock, trace, "ust", new_subbuf_size),
 	       "ustctl_set_subbuf_size");
 
 
 	/* Allocate the new trace */
-	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace - allocate the new trace");
+	tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace - allocate the new trace");
 
 
         /* Get subbuf size and number and compare with what was set */
-	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
+	subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
 
-	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
+	subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
 
 	tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d",
 	       subbuf_num, new_subbuf_num);
 
 
-	result = ustctl_get_subbuf_size(trace, "ust", pid);
+	result = ustctl_get_subbuf_size(sock, trace, "ust");
 	tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d",
 	       subbuf_size, new_subbuf_size);
 
-	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace - without ever starting");
+	tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace - without ever starting");
 
 	/*
 	 * Activate a non-existent marker, this should be possible as the marker
 	 * can be loaded at a later time.
 	 */
-	tap_ok(ustctl_set_marker_state(trace, "ustl", "blar", 1, pid) == 0,
+	tap_ok(ustctl_set_marker_state(sock, trace, "ustl", "blar", 1) == 0,
 	       "Enable non-existent marker ustl blar");
 
 	printf("##### Tests that definetly should work are completed #####\n");
 	printf("############## Start expected failure cases ##############\n");
 
-	tap_ok(ustctl_set_marker_state(trace, "ust","bar", 1, pid),
+	tap_ok(ustctl_set_marker_state(sock, trace, "ust","bar", 1),
 	       "Enable already enabled marker ust/bar");
+
 	tap_ok(EEXIST == errno,
 	       "Right error code for enabling an already enabled marker");
 
-	tap_ok(ustctl_start_trace(trace, pid),
+	tap_ok(ustctl_start_trace(sock, trace),
 	       "Start a non-existent trace");
 
-	tap_ok(ustctl_destroy_trace(trace, pid),
+	tap_ok(ustctl_destroy_trace(sock, trace),
 	       "Destroy non-existent trace");
 
 	exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS);
@@ -167,7 +171,7 @@ int main(int argc, char **argv)
 	int i, status;
 	pid_t parent_pid, child_pid;
 
-	tap_plan(28);
+	tap_plan(29);
 
 	printf("Function tests for ustctl\n");
 
diff --git a/ustctl/channel_cmds.c b/ustctl/channel_cmds.c
index 2ccf460..315fd56 100644
--- a/ustctl/channel_cmds.c
+++ b/ustctl/channel_cmds.c
@@ -24,12 +24,11 @@
 
 static int set_subbuf_size(int argc, char *argv[])
 {
-	int result = 0;
-	pid_t pid;
+	int sock, result = 0;
 	char *channel = NULL;
 	unsigned int size;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
 	if (scan_ch_and_num(argv[3], &channel, &size)) {
 		fprintf(stderr, "Failed to scan channel and size from"
@@ -38,10 +37,10 @@ static int set_subbuf_size(int argc, char *argv[])
 			free(channel);
 		return -1;
 	}
-	if (ustctl_set_subbuf_size(argv[2], channel, size, pid)) {
+	if (ustctl_set_subbuf_size(sock, argv[2], channel, size)) {
 		ERR("error while trying to set the size of subbuffers "
-		    "for PID %u\n",
-		    pid);
+		    "for PID %s\n",
+		    argv[1]);
 		result = -1;
 	}
 
@@ -52,12 +51,11 @@ static int set_subbuf_size(int argc, char *argv[])
 
 static int set_subbuf_num(int argc, char *argv[])
 {
-	int result = 0;
-	pid_t pid;
+	int sock, result = 0;
 	char *channel = NULL;
 	unsigned int num;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
 	if (scan_ch_and_num(argv[3], &channel, &num)) {
 		fprintf(stderr, "Failed to scan channel and number from"
@@ -66,9 +64,9 @@ static int set_subbuf_num(int argc, char *argv[])
 			free(channel);
 		return -1;
 	}
-	if (ustctl_set_subbuf_num(argv[2], channel, num, pid)) {
-		ERR("error while trying to set the number of subbuffers for PID %u\n",
-		    pid);
+	if (ustctl_set_subbuf_num(sock, argv[2], channel, num)) {
+		ERR("error while trying to set the number of subbuffers for PID %s\n",
+		    argv[1]);
 		result = -1;
 	}
 
@@ -79,14 +77,14 @@ static int set_subbuf_num(int argc, char *argv[])
 
 static int get_subbuf_size(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 	unsigned int size;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if ((size = ustctl_get_subbuf_size(argv[2], argv[3], pid)) < 0) {
-		ERR("error while trying to get the subbuffer size from PID %u\n",
-		    pid);
+	if ((size = ustctl_get_subbuf_size(sock, argv[2], argv[3])) < 0) {
+		ERR("error while trying to get the subbuffer size from PID %s\n",
+		    argv[1]);
 		return -1;
 	}
 
@@ -97,14 +95,14 @@ static int get_subbuf_size(int argc, char *argv[])
 
 static int get_subbuf_num(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 	unsigned int num;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if ((num = ustctl_get_subbuf_num(argv[2], argv[3], pid)) < 0) {
-		ERR("error while trying to get the subbuffer size from PID %u\n",
-		    pid);
+	if ((num = ustctl_get_subbuf_num(sock, argv[2], argv[3])) < 0) {
+		ERR("error while trying to get the subbuffer size from PID %s\n",
+		    argv[1]);
 		return -1;
 	}
 
diff --git a/ustctl/marker_cmds.c b/ustctl/marker_cmds.c
index 6544669..da14358 100644
--- a/ustctl/marker_cmds.c
+++ b/ustctl/marker_cmds.c
@@ -25,19 +25,18 @@
 static int list_markers(int argc, char *argv[])
 {
 	struct marker_status *cmsf = NULL;
-	int i;
-	pid_t pid;
+	int i, sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_get_cmsf(&cmsf, pid)) {
-		ERR("error while trying to list markers for PID %u\n", pid);
+	if (ustctl_get_cmsf(sock, &cmsf)) {
+		ERR("error while trying to list markers for PID %s\n", argv[1]);
 		return -1;
 	}
 	for (i = 0; cmsf[i].channel; i++) {
-		printf("{PID: %u, channel/marker: %s/%s, "
+		printf("{PID: %s, channel/marker: %s/%s, "
 		       "state: %u, fmt: %s}\n",
-		       (unsigned int) pid,
+		       argv[1],
 		       cmsf[i].channel,
 		       cmsf[i].marker,
 		       cmsf[i].state,
@@ -49,11 +48,10 @@ static int list_markers(int argc, char *argv[])
 
 static int enable_marker(int argc, char *argv[])
 {
-	int i, result = 0;
-	pid_t pid;
+	int i, sock, result = 0;
 	char *channel, *marker;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
 	for (i = 3; i < argc; i++) {
 		channel = NULL;
@@ -68,9 +66,9 @@ static int enable_marker(int argc, char *argv[])
 			if (marker)
 				free(marker);
 		}
-		if (ustctl_set_marker_state(argv[2], channel, marker, 1, pid)) {
-			PERROR("error while trying to enable marker %s with PID %u",
-			       argv[i], pid);
+		if (ustctl_set_marker_state(sock, argv[2], channel, marker, 1)) {
+			PERROR("error while trying to enable marker %s with PID %s",
+			       argv[i], argv[1]);
 			result = -1;
 		}
 		free(channel);
@@ -82,11 +80,10 @@ static int enable_marker(int argc, char *argv[])
 
 static int disable_marker(int argc, char *argv[])
 {
-	int i, result = 0;
-	pid_t pid;
+	int i, sock, result = 0;
 	char *channel, *marker;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
 	for (i = 3; i < argc; i++) {
 		channel = NULL;
@@ -101,9 +98,9 @@ static int disable_marker(int argc, char *argv[])
 				free(marker);
 			return -1;
 		}
-		if (ustctl_set_marker_state(argv[2], channel, marker, 0, pid)) {
-			PERROR("error while trying to disable marker %s with PID %u",
-			       argv[i], pid);
+		if (ustctl_set_marker_state(sock, argv[2], channel, marker, 0)) {
+			PERROR("error while trying to disable marker %s with PID %s",
+			       argv[i], argv[1]);
 			result = -1;
 		}
 		free(channel);
diff --git a/ustctl/scanning_functions.c b/ustctl/scanning_functions.c
index a3eceb5..4aa8c1c 100644
--- a/ustctl/scanning_functions.c
+++ b/ustctl/scanning_functions.c
@@ -21,9 +21,10 @@
 #include "usterr.h"
 
 
-pid_t parse_pid(const char *pid_string)
+int parse_and_connect_pid(const char *pid_string)
 {
 	pid_t pid;
+	int sock;
 
 	errno = 0;
 	pid = strtoull(pid_string, NULL, 10);
@@ -32,7 +33,13 @@ pid_t parse_pid(const char *pid_string)
 		exit(EXIT_FAILURE);
 	}
 
-	return pid;
+	sock = ustctl_connect_pid(pid);
+	if (sock < 0) {
+		perror("Failed to connect to process");
+		exit(EXIT_FAILURE);
+	}
+
+	return sock;
 }
 
 int scan_ch_marker(const char *channel_marker, char **channel, char **marker)
diff --git a/ustctl/scanning_functions.h b/ustctl/scanning_functions.h
index c37eba1..0f2d62e 100644
--- a/ustctl/scanning_functions.h
+++ b/ustctl/scanning_functions.h
@@ -17,7 +17,7 @@
 #ifndef __SCANNING_FUNCTIONS_H
 #define __SCANNING_FUNCTIONS_H
 
-pid_t parse_pid(const char *pid_string);
+int parse_and_connect_pid(const char *pid_string);
 
 int scan_ch_marker(const char *channel_marker, char **channel, char **marker);
 
diff --git a/ustctl/trace_cmds.c b/ustctl/trace_cmds.c
index 020e5b2..74e4660 100644
--- a/ustctl/trace_cmds.c
+++ b/ustctl/trace_cmds.c
@@ -25,12 +25,12 @@
 
 static int create_trace(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_create_trace(argv[2], pid)) {
-		ERR("Failed to create trace %s for PID %u\n", argv[2], pid);
+	if (ustctl_create_trace(sock, argv[2])) {
+		ERR("Failed to create trace %s for PID %u\n", argv[2], argv[1]);
 		return -1;
 	}
 
@@ -39,12 +39,12 @@ static int create_trace(int argc, char *argv[])
 
 static int alloc_trace(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_alloc_trace(argv[2], pid)) {
-		ERR("Failed to allocate trace %s for PID %u\n", argv[2], pid);
+	if (ustctl_alloc_trace(sock, argv[2])) {
+		ERR("Failed to allocate trace %s for PID %s\n", argv[2], argv[1]);
 		return -1;
 	}
 	return 0;
@@ -52,12 +52,12 @@ static int alloc_trace(int argc, char *argv[])
 
 static int start_trace(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_start_trace(argv[2], pid)) {
-		ERR("Failed to start trace %s for PID %u\n", argv[2], pid);
+	if (ustctl_start_trace(sock, argv[2])) {
+		ERR("Failed to start trace %s for PID %s\n", argv[2], argv[1]);
 		return -1;
 	}
 	return 0;
@@ -65,12 +65,12 @@ static int start_trace(int argc, char *argv[])
 
 static int stop_trace(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_stop_trace(argv[2], pid)) {
-		ERR("Failed to stop trace %s for PID %u\n", argv[2], pid);
+	if (ustctl_stop_trace(sock, argv[2])) {
+		ERR("Failed to stop trace %s for PID %s\n", argv[2], argv[1]);
 		return -1;
 	}
 	return 0;
@@ -78,12 +78,12 @@ static int stop_trace(int argc, char *argv[])
 
 static int destroy_trace(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_destroy_trace(argv[2], pid)) {
-		ERR("Failed to destroy trace %s for PID %u\n", argv[2], pid);
+	if (ustctl_destroy_trace(sock, argv[2])) {
+		ERR("Failed to destroy trace %s for PID %s\n", argv[2], argv[1]);
 		return -1;
 	}
 	return 0;
@@ -91,12 +91,12 @@ static int destroy_trace(int argc, char *argv[])
 
 static int force_subbuf_switch(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_force_switch(pid)) {
-		ERR("error while trying to force switch for PID %u\n", pid);
+	if (ustctl_force_switch(sock, argv[2])) {
+		ERR("error while trying to force switch for PID %s\n", argv[1]);
 		return -1;
 	}
 
diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c
index c1bbe8c..b9acc23 100644
--- a/ustctl/ustctl.c
+++ b/ustctl/ustctl.c
@@ -106,21 +106,20 @@ int main(int argc, char *argv[])
 static int list_trace_events(int argc, char *argv[])
 {
 	struct trace_event_status *tes = NULL;
-	int i;
-	pid_t pid;
+	int i, sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_get_tes(&tes, pid)) {
+	if (ustctl_get_tes(sock, &tes)) {
 		ERR("error while trying to list "
-		    "trace_events for PID %u\n",
-		    pid);
+		    "trace_events for PID %s\n",
+		    argv[1]);
 		return -1;
 	}
 	i = 0;
 	for (i = 0; tes[i].name; i++) {
-		printf("{PID: %u, trace_event: %s}\n",
-		       pid,
+		printf("{PID: %s, trace_event: %s}\n",
+		       argv[1],
 		       tes[i].name);
 	}
 	ustctl_free_tes(tes);
@@ -130,12 +129,12 @@ static int list_trace_events(int argc, char *argv[])
 
 static int set_sock_path(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_set_sock_path(argv[2], pid)) {
-		ERR("error while trying to set sock path for PID %u\n", pid);
+	if (ustctl_set_sock_path(sock, argv[2])) {
+		ERR("error while trying to set sock path for PID %s\n", argv[1]);
 		return -1;
 	}
 
@@ -144,13 +143,13 @@ static int set_sock_path(int argc, char *argv[])
 
 static int get_sock_path(int argc, char *argv[])
 {
-	pid_t pid;
+	int sock;
 	char *sock_path;
 
-	pid = parse_pid(argv[1]);
+	sock = parse_and_connect_pid(argv[1]);
 
-	if (ustctl_get_sock_path(&sock_path, pid)) {
-		ERR("error while trying to get sock path for PID %u\n", pid);
+	if (ustctl_get_sock_path(sock, &sock_path)) {
+		ERR("error while trying to get sock path for PID %s\n", argv[1]);
 		return -1;
 	}
 	printf("The socket path is %s\n", sock_path);
-- 
1.7.1





^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ltt-dev] [UST PATCH] libustctl: use direct socket communication
  2011-02-24 12:26 [ltt-dev] [UST PATCH] libustctl: use direct socket communication Nils Carlson
@ 2011-02-24 12:33 ` Mathieu Desnoyers
       [not found] ` <BLU0-SMTP78C50A8553DE923A970DA096DA0@phx.gbl>
  1 sibling, 0 replies; 3+ messages in thread
From: Mathieu Desnoyers @ 2011-02-24 12:33 UTC (permalink / raw)


* Nils Carlson (nils.carlson at ericsson.com) wrote:
> This patch changes libustctl to be socket instead of pid oriented.
> The user is expected to connect to a pid using
> ustctl_connect_pid(pid_t) which returns a socket file-descriptor and
> then use the socket for the rest of the api. This reduces the amount
> of open and closing systemcalls and also makes it possible for a
> session daemon to detect process shutdown by the socket closing.

Looks good! Thanks!

Acked-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>

> 
> David, this ones for you. :-)
> 
> Signed-off-by: Nils Carlson <nils.carlson at ericsson.com>
> ---
>  include/ust/ustctl.h                               |   66 ++++++---
>  libustctl/libustctl.c                              |  150 +++++++++-----------
>  .../libustctl_function_tests.c                     |   58 ++++----
>  ustctl/channel_cmds.c                              |   42 +++---
>  ustctl/marker_cmds.c                               |   35 ++---
>  ustctl/scanning_functions.c                        |   11 ++-
>  ustctl/scanning_functions.h                        |    2 +-
>  ustctl/trace_cmds.c                                |   48 +++---
>  ustctl/ustctl.c                                    |   31 ++--
>  9 files changed, 229 insertions(+), 214 deletions(-)
> 
> diff --git a/include/ust/ustctl.h b/include/ust/ustctl.h
> index 195ee26..35f7617 100644
> --- a/include/ust/ustctl.h
> +++ b/include/ust/ustctl.h
> @@ -48,29 +48,51 @@ struct trace_event_status {
>  };
>  
>  extern pid_t *ustctl_get_online_pids(void);
> -extern int ustctl_set_marker_state(const char *trace, const char *channel,
> -				   const char *marker, int state, pid_t pid);
> -extern int ustctl_set_subbuf_size(const char *trace, const char *channel,
> -				  unsigned int subbuf_size, pid_t pid);
> -extern int ustctl_set_subbuf_num(const char *trace, const char *channel,
> -				 unsigned int num, pid_t pid);
> -extern int ustctl_get_subbuf_size(const char *trace, const char *channel,
> -				  pid_t pid);
> -extern int ustctl_get_subbuf_num(const char *trace, const char *channel,
> -				 pid_t pid);
> -extern int ustctl_destroy_trace(const char *trace, pid_t pid);
> -extern int ustctl_setup_and_start(const char *trace, pid_t pid);
> -extern int ustctl_stop_trace(const char *trace, pid_t pid);
> -extern int ustctl_create_trace(const char *trace, pid_t pid);
> -extern int ustctl_start_trace(const char *trace, pid_t pid);
> -extern int ustctl_alloc_trace(const char *trace, pid_t pid);
> +
> +extern int ustctl_connect_pid(pid_t pid);
> +
> +extern int ustctl_set_marker_state(int sock, const char *trace,
> +				   const char *channel, const char *marker,
> +				   int state);
> +
> +extern int ustctl_set_subbuf_size(int sock, const char *trace,
> +				  const char *channel,
> +				  unsigned int subbuf_size);
> +
> +extern int ustctl_set_subbuf_num(int sock, const char *trace,
> +				 const char *channel,
> +				 unsigned int num);
> +
> +extern int ustctl_get_subbuf_size(int sock, const char *trace,
> +				  const char *channel);
> +
> +extern int ustctl_get_subbuf_num(pid_t pid, const char *trace,
> +				 const char *channel);
> +
> +extern int ustctl_destroy_trace(int sock, const char *trace);
> +
> +extern int ustctl_setup_and_start(int sock, const char *trace);
> +
> +extern int ustctl_stop_trace(int sock, const char *trace);
> +
> +extern int ustctl_create_trace(int sock, const char *trace);
> +
> +extern int ustctl_start_trace(int sock, const char *trace);
> +
> +extern int ustctl_alloc_trace(int sock, const char *trace);
> +
>  extern int ustctl_free_cmsf(struct marker_status *);
> -extern unsigned int ustctl_count_nl(const char *);
> -extern int ustctl_get_cmsf(struct marker_status **, pid_t);
>  extern int ustctl_free_tes(struct trace_event_status *);
> -extern int ustctl_get_tes(struct trace_event_status **, pid_t);
> -extern int ustctl_set_sock_path(const char *sock_path, pid_t pid);
> -extern int ustctl_get_sock_path(char **sock_path, pid_t pid);
> -extern int ustctl_force_switch(pid_t pid);
> +extern unsigned int ustctl_count_nl(const char *);
> +
> +extern int ustctl_get_cmsf(int sock, struct marker_status **);
> +
> +extern int ustctl_get_tes(int sock, struct trace_event_status **);
> +
> +extern int ustctl_set_sock_path(int sock, const char *sock_path);
> +
> +extern int ustctl_get_sock_path(int sock, char **sock_path);
> +
> +extern int ustctl_force_switch(int sock, const char *trace);
>  
>  #endif /* _USTCTL_H */
> diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c
> index 9c4ced2..e9709c5 100644
> --- a/libustctl/libustctl.c
> +++ b/libustctl/libustctl.c
> @@ -1,4 +1,5 @@
>  /* Copyright (C) 2009  Pierre-Marc Fournier, Philippe Proulx-Barrette
> + * Copyright (C) 2011  Ericsson AB
>   *
>   * This library is free software; you can redistribute it and/or
>   * modify it under the terms of the GNU Lesser General Public
> @@ -28,28 +29,22 @@
>  #include "ust/ustctl.h"
>  #include "usterr.h"
>  
> -static int do_cmd(const pid_t pid,
> +static int do_cmd(int sock,
>  		  const struct ustcomm_header *req_header,
>  		  const char *req_data,
>  		  struct ustcomm_header *res_header,
>  		  char **res_data)
>  {
> -	int app_fd, result, saved_errno = 0;
> +	int result, saved_errno = 0;
>  	char *recv_buf;
>  
> -	if (ustcomm_connect_app(pid, &app_fd)) {
> -		ERR("could not connect to PID %u", (unsigned int) pid);
> -		errno = ENOTCONN;
> -		return -1;
> -	}
> -
>  	recv_buf = zmalloc(USTCOMM_BUFFER_SIZE);
>  	if (!recv_buf) {
>  		saved_errno = ENOMEM;
> -		goto close_app_fd;
> +		goto out;
>  	}
>  
> -	result = ustcomm_req(app_fd, req_header, req_data, res_header, recv_buf);
> +	result = ustcomm_req(sock, req_header, req_data, res_header, recv_buf);
>  	if (result > 0) {
>  		saved_errno = -res_header->result;
>  		if (res_header->size == 0 || saved_errno > 0) {
> @@ -71,11 +66,8 @@ static int do_cmd(const pid_t pid,
>  		free(recv_buf);
>  	}
>  
> -close_app_fd:
> -	close(app_fd);
> -
> +out:
>  	errno = saved_errno;
> -
>  	if (errno) {
>  		return -1;
>  	}
> @@ -83,6 +75,19 @@ close_app_fd:
>  	return 0;
>  }
>  
> +int ustctl_connect_pid(pid_t pid)
> +{
> +	int sock;
> +
> +	if (ustcomm_connect_app(pid, &sock)) {
> +		ERR("could not connect to PID %u", (unsigned int) pid);
> +		errno = ENOTCONN;
> +		return -1;
> +	}
> +
> +	return sock;
> +}
> +
>  pid_t *ustctl_get_online_pids(void)
>  {
>  	struct dirent *dirent;
> @@ -140,8 +145,8 @@ pid_t *ustctl_get_online_pids(void)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or errors {USTCTL_ERR_GEN, USTCTL_ERR_ARG}
>   */
> -int ustctl_set_marker_state(const char *trace, const char *channel,
> -			    const char *marker, int state, pid_t pid)
> +int ustctl_set_marker_state(int sock, const char *trace, const char *channel,
> +			    const char *marker, int state)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	struct ustcomm_marker_info marker_inf;
> @@ -159,7 +164,7 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
>  
>  	req_header.command = state ? ENABLE_MARKER : DISABLE_MARKER;
>  
> -	return do_cmd(pid, &req_header, (char *)&marker_inf,
> +	return do_cmd(sock, &req_header, (char *)&marker_inf,
>  		      &res_header, NULL);
>  }
>  
> @@ -170,8 +175,8 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
>   * @param pid		Traced process ID
>   * @return		0 if successful, or error
>   */
> -int ustctl_set_subbuf_size(const char *trace, const char *channel,
> -			   unsigned int subbuf_size, pid_t pid)
> +int ustctl_set_subbuf_size(int sock, const char *trace, const char *channel,
> +			   unsigned int subbuf_size)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	struct ustcomm_channel_info ch_inf;
> @@ -189,7 +194,7 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
>  	req_header.command = SET_SUBBUF_SIZE;
>  	ch_inf.subbuf_size = subbuf_size;
>  
> -	return do_cmd(pid, &req_header, (char *)&ch_inf,
> +	return do_cmd(sock, &req_header, (char *)&ch_inf,
>  		      &res_header, NULL);
>  }
>  
> @@ -200,8 +205,8 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
>   * @param pid		Traced process ID
>   * @return		0 if successful, or error
>   */
> -int ustctl_set_subbuf_num(const char *trace, const char *channel,
> -			  unsigned int num, pid_t pid)
> +int ustctl_set_subbuf_num(int sock, const char *trace, const char *channel,
> +			  unsigned int num)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	struct ustcomm_channel_info ch_inf;
> @@ -219,13 +224,14 @@ int ustctl_set_subbuf_num(const char *trace, const char *channel,
>  	req_header.command = SET_SUBBUF_NUM;
>  	ch_inf.subbuf_num = num;
>  
> -	return do_cmd(pid, &req_header, (char *)&ch_inf,
> +	return do_cmd(sock, &req_header, (char *)&ch_inf,
>  		      &res_header, NULL);
>  
>  }
>  
> -static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
> -				      pid_t pid, int *num, int *size)
> +
> +static int ustctl_get_subbuf_num_size(int sock, const char *trace, const char *channel,
> +				      int *num, int *size)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	struct ustcomm_channel_info ch_inf, *ch_inf_res;
> @@ -243,7 +249,7 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
>  
>  	req_header.command = GET_SUBBUF_NUM_SIZE;
>  
> -	result = do_cmd(pid, &req_header, (char *)&ch_inf,
> +	result = do_cmd(sock, &req_header, (char *)&ch_inf,
>  			&res_header, (char **)&ch_inf_res);
>  	if (result < 0) {
>  		return -1;
> @@ -264,11 +270,11 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
>   * @param pid		Traced process ID
>   * @return		subbuf cnf if successful, or error
>   */
> -int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
> +int ustctl_get_subbuf_num(int sock, const char *trace, const char *channel)
>  {
>  	int num, size, result;
>  
> -	result = ustctl_get_subbuf_num_size(trace, channel, pid,
> +	result = ustctl_get_subbuf_num_size(sock, trace, channel,
>  					    &num, &size);
>  	if (result < 0) {
>  		errno = -result;
> @@ -285,11 +291,11 @@ int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
>   * @param pid		Traced process ID
>   * @return		subbuf size if successful, or error
>   */
> -int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
> +int ustctl_get_subbuf_size(int sock, const char *trace, const char *channel)
>  {
>  	int num, size, result;
>  
> -	result = ustctl_get_subbuf_num_size(trace, channel, pid,
> +	result = ustctl_get_subbuf_num_size(sock, trace, channel,
>  					    &num, &size);
>  	if (result < 0) {
>  		errno = -result;
> @@ -299,8 +305,7 @@ int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
>  	return size;
>  }
>  
> -
> -static int do_trace_cmd(const char *trace, pid_t pid, int command)
> +static int do_trace_cmd(int sock, const char *trace, int command)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	struct ustcomm_single_field trace_inf;
> @@ -316,7 +321,7 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
>  
>  	req_header.command = command;
>  
> -	return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL);
> +	return do_cmd(sock, &req_header, (char *)&trace_inf, &res_header, NULL);
>  }
>  
>  /**
> @@ -325,9 +330,9 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_destroy_trace(const char *trace, pid_t pid)
> +int ustctl_destroy_trace(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, DESTROY_TRACE);
> +	return do_trace_cmd(sock, trace, DESTROY_TRACE);
>  }
>  
>  /**
> @@ -336,9 +341,9 @@ int ustctl_destroy_trace(const char *trace, pid_t pid)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_setup_and_start(const char *trace, pid_t pid)
> +int ustctl_setup_and_start(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, START);
> +	return do_trace_cmd(sock, trace, START);
>  }
>  
>  /**
> @@ -347,9 +352,9 @@ int ustctl_setup_and_start(const char *trace, pid_t pid)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_create_trace(const char *trace, pid_t pid)
> +int ustctl_create_trace(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, CREATE_TRACE);
> +	return do_trace_cmd(sock, trace, CREATE_TRACE);
>  }
>  
>  /**
> @@ -358,9 +363,9 @@ int ustctl_create_trace(const char *trace, pid_t pid)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_start_trace(const char *trace, pid_t pid)
> +int ustctl_start_trace(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, START_TRACE);
> +	return do_trace_cmd(sock, trace, START_TRACE);
>  }
>  
>  /**
> @@ -369,9 +374,9 @@ int ustctl_start_trace(const char *trace, pid_t pid)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_alloc_trace(const char *trace, pid_t pid)
> +int ustctl_alloc_trace(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, ALLOC_TRACE);
> +	return do_trace_cmd(sock, trace, ALLOC_TRACE);
>  }
>  
>  /**
> @@ -380,9 +385,9 @@ int ustctl_alloc_trace(const char *trace, pid_t pid)
>   * @param pid	Traced process ID
>   * @return	0 if successful, or error USTCTL_ERR_GEN
>   */
> -int ustctl_stop_trace(const char *trace, pid_t pid)
> +int ustctl_stop_trace(int sock, const char *trace)
>  {
> -	return do_trace_cmd(trace, pid, STOP_TRACE);
> +	return do_trace_cmd(sock, trace, STOP_TRACE);
>  }
>  
>  /**
> @@ -437,11 +442,11 @@ int ustctl_free_cmsf(struct marker_status *cmsf)
>   * @param pid	Targeted PID
>   * @return	0 if successful, or -1 on error
>   */
> -int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
> +int ustctl_get_cmsf(int sock, struct marker_status **cmsf)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	char *big_str = NULL;
> -	int result, app_fd;
> +	int result;
>  	struct marker_status *tmp_cmsf = NULL;
>  	unsigned int i = 0, cmsf_ind = 0;
>  
> @@ -449,28 +454,21 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
>  		return -1;
>  	}
>  
> -	if (ustcomm_connect_app(pid, &app_fd)) {
> -		ERR("could not connect to PID %u", (unsigned int) pid);
> -		return -1;
> -	}
> -
>  	req_header.command = LIST_MARKERS;
>  	req_header.size = 0;
>  
> -	result = ustcomm_send(app_fd, &req_header, NULL);
> +	result = ustcomm_send(sock, &req_header, NULL);
>  	if (result <= 0) {
> -		PERROR("error while requesting markers list for process %d", pid);
> +		PERROR("error while requesting markers list");
>  		return -1;
>  	}
>  
> -	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> +	result = ustcomm_recv_alloc(sock, &res_header, &big_str);
>  	if (result <= 0) {
>  		ERR("error while receiving markers list");
>  		return -1;
>  	}
>  
> -	close(app_fd);
> -
>  	tmp_cmsf = (struct marker_status *) zmalloc(sizeof(struct marker_status) *
>  						    (ustctl_count_nl(big_str) + 1));
>  	if (tmp_cmsf == NULL) {
> @@ -506,7 +504,6 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
>  	return 0;
>  }
>  
> -
>  /**
>   * Frees a TES array.
>   *
> @@ -537,12 +534,11 @@ int ustctl_free_tes(struct trace_event_status *tes)
>   * @param pid	Targeted PID
>   * @return	0 if successful, or -1 on error
>   */
> -int ustctl_get_tes(struct trace_event_status **tes,
> -		   const pid_t pid)
> +int ustctl_get_tes(int sock, struct trace_event_status **tes)
>  {
>  	struct ustcomm_header req_header, res_header;
>  	char *big_str = NULL;
> -	int result, app_fd;
> +	int result;
>  	struct trace_event_status *tmp_tes = NULL;
>  	unsigned int i = 0, tes_ind = 0;
>  
> @@ -550,28 +546,21 @@ int ustctl_get_tes(struct trace_event_status **tes,
>  		return -1;
>  	}
>  
> -	if (ustcomm_connect_app(pid, &app_fd)) {
> -		ERR("could not connect to PID %u", (unsigned int) pid);
> -		return -1;
> -	}
> -
>  	req_header.command = LIST_TRACE_EVENTS;
>  	req_header.size = 0;
>  
> -	result = ustcomm_send(app_fd, &req_header, NULL);
> +	result = ustcomm_send(sock, &req_header, NULL);
>  	if (result != 1) {
>  		ERR("error while requesting trace_event list");
>  		return -1;
>  	}
>  
> -	result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
> +	result = ustcomm_recv_alloc(sock, &res_header, &big_str);
>  	if (result != 1) {
>  		ERR("error while receiving markers list");
>  		return -1;
>  	}
>  
> -	close(app_fd);
> -
>  	tmp_tes = (struct trace_event_status *)
>  		zmalloc(sizeof(struct trace_event_status) *
>  			(ustctl_count_nl(big_str) + 1));
> @@ -599,13 +588,13 @@ int ustctl_get_tes(struct trace_event_status **tes,
>  }
>  
>  /**
> - * Set socket path
> + * Set sock path
>   *
> - * @param sock_path	Socket path
> + * @param sock_path	Sock path
>   * @param pid		Traced process ID
>   * @return		0 if successful, or error
>   */
> -int ustctl_set_sock_path(const char *sock_path, pid_t pid)
> +int ustctl_set_sock_path(int sock, const char *sock_path)
>  {
>  	int result;
>  	struct ustcomm_header req_header, res_header;
> @@ -621,18 +610,18 @@ int ustctl_set_sock_path(const char *sock_path, pid_t pid)
>  
>  	req_header.command = SET_SOCK_PATH;
>  
> -	return do_cmd(pid, &req_header, (char *)&sock_path_msg,
> +	return do_cmd(sock, &req_header, (char *)&sock_path_msg,
>  		      &res_header, NULL);
>  }
>  
>  /**
> - * Get socket path
> + * Get sock path
>   *
> - * @param sock_path	Pointer to where the socket path will be returned
> + * @param sock_path	Pointer to where the sock path will be returned
>   * @param pid		Traced process ID
>   * @return		0 if successful, or error
>   */
> -int ustctl_get_sock_path(char **sock_path, pid_t pid)
> +int ustctl_get_sock_path(int sock, char **sock_path)
>  {
>  	int result;
>  	struct ustcomm_header req_header, res_header;
> @@ -641,7 +630,7 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
>  	req_header.command = GET_SOCK_PATH;
>  	req_header.size = 0;
>  
> -	result = do_cmd(pid, &req_header, NULL, &res_header,
> +	result = do_cmd(sock, &req_header, NULL, &res_header,
>  			(char **)&sock_path_msg);
>  	if (result < 0) {
>  		return -1;
> @@ -659,13 +648,12 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
>  	return 0;
>  }
>  
> -int ustctl_force_switch(pid_t pid)
> +int ustctl_force_switch(int sock, const char *trace)
>  {
>  	struct ustcomm_header req_header, res_header;
>  
>  	req_header.command = FORCE_SUBBUF_SWITCH;
>  	req_header.size = 0;
>  
> -	return do_cmd(pid, &req_header, NULL, &res_header, NULL);
> +	return do_cmd(sock, &req_header, NULL, &res_header, NULL);
>  }
> -
> diff --git a/tests/libustctl_function_tests/libustctl_function_tests.c b/tests/libustctl_function_tests/libustctl_function_tests.c
> index 1461997..7406243 100644
> --- a/tests/libustctl_function_tests/libustctl_function_tests.c
> +++ b/tests/libustctl_function_tests/libustctl_function_tests.c
> @@ -30,7 +30,7 @@
>  
>  static void ustctl_function_tests(pid_t pid)
>  {
> -	int result;
> +	int result, sock;
>  	unsigned int subbuf_size, subbuf_num;
>  	unsigned int new_subbuf_size, new_subbuf_num;
>  	struct marker_status *marker_status, *ms_ptr;
> @@ -40,8 +40,11 @@ static void ustctl_function_tests(pid_t pid)
>  
>  	printf("Connecting to pid %d\n", pid);
>  
> +	sock = ustctl_connect_pid(pid);
> +	tap_ok(sock > 0, "ustctl_connect_pid");
> +
>  	/* marker status array functions */
> -	result = ustctl_get_cmsf(&marker_status, pid);
> +	result = ustctl_get_cmsf(sock, &marker_status);
>  	tap_ok(!result, "ustctl_get_cmsf");
>  
>  	result = 0;
> @@ -56,15 +59,15 @@ static void ustctl_function_tests(pid_t pid)
>  	tap_ok(!ustctl_free_cmsf(marker_status), "ustctl_free_cmsf");
>  
>  	/* Get and set the socket path */
> -	tap_ok(!ustctl_get_sock_path(&old_socket_path, pid),
> +	tap_ok(!ustctl_get_sock_path(sock, &old_socket_path),
>  	       "ustctl_get_sock_path");
>  
>  	printf("Socket path: %s\n", old_socket_path);
>  
> -	tap_ok(!ustctl_set_sock_path(tmp_ustd_socket, pid),
> +	tap_ok(!ustctl_set_sock_path(sock, tmp_ustd_socket),
>  	       "ustctl_set_sock_path - set a new path");
>  
> -	tap_ok(!ustctl_get_sock_path(&new_socket_path, pid),
> +	tap_ok(!ustctl_get_sock_path(sock, &new_socket_path),
>  	       "ustctl_get_sock_path - get the new path");
>  
>  	tap_ok(!strcmp(new_socket_path, tmp_ustd_socket),
> @@ -72,90 +75,91 @@ static void ustctl_function_tests(pid_t pid)
>  
>  	free(new_socket_path);
>  
> -	tap_ok(!ustctl_set_sock_path(old_socket_path, pid),
> +	tap_ok(!ustctl_set_sock_path(sock, old_socket_path),
>  	       "Reset the socket path");
>  
>  	free(old_socket_path);
>  
>  	/* Enable, disable markers */
> -	tap_ok(!ustctl_set_marker_state(trace, "ust", "bar", 1, pid),
> +	tap_ok(!ustctl_set_marker_state(sock, trace, "ust", "bar", 1),
>  	       "ustctl_set_marker_state - existing marker ust bar");
>  
>  	/* Create and allocate a trace */
> -	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace");
> +	tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace");
>  
> -	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace");
> +	tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace");
>  
>  	/* Get subbuf size and number */
> -	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
> +	subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
>  	tap_ok(subbuf_num > 0, "ustctl_get_subbuf_num - %d sub-buffers",
>  	       subbuf_num);
>  
> -	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
> +	subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
>  	tap_ok(subbuf_size, "ustctl_get_subbuf_size - sub-buffer size is %d",
>  	       subbuf_size);
>  
>  	/* Start the trace */
> -	tap_ok(!ustctl_start_trace(trace, pid), "ustctl_start_trace");
> +	tap_ok(!ustctl_start_trace(sock, trace), "ustctl_start_trace");
>  
>  
>  	/* Stop the trace and destroy it*/
> -	tap_ok(!ustctl_stop_trace(trace, pid), "ustctl_stop_trace");
> +	tap_ok(!ustctl_stop_trace(sock, trace), "ustctl_stop_trace");
>  
> -	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace");
> +	tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace");
>  
>  	/* Create a new trace */
> -	tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace - create a new trace");
> +	tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace - create a new trace");
>  
>  	printf("Setting new subbufer number and sizes (doubling)\n");
>  	new_subbuf_num = 2 * subbuf_num;
>  	new_subbuf_size = 2 * subbuf_size;
>  
> -	tap_ok(!ustctl_set_subbuf_num(trace, "ust", new_subbuf_num, pid),
> +	tap_ok(!ustctl_set_subbuf_num(sock, trace, "ust", new_subbuf_num),
>  	       "ustctl_set_subbuf_num");
>  
> -	tap_ok(!ustctl_set_subbuf_size(trace, "ust", new_subbuf_size, pid),
> +	tap_ok(!ustctl_set_subbuf_size(sock, trace, "ust", new_subbuf_size),
>  	       "ustctl_set_subbuf_size");
>  
>  
>  	/* Allocate the new trace */
> -	tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace - allocate the new trace");
> +	tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace - allocate the new trace");
>  
>  
>          /* Get subbuf size and number and compare with what was set */
> -	subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
> +	subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
>  
> -	subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
> +	subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
>  
>  	tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d",
>  	       subbuf_num, new_subbuf_num);
>  
>  
> -	result = ustctl_get_subbuf_size(trace, "ust", pid);
> +	result = ustctl_get_subbuf_size(sock, trace, "ust");
>  	tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d",
>  	       subbuf_size, new_subbuf_size);
>  
> -	tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace - without ever starting");
> +	tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace - without ever starting");
>  
>  	/*
>  	 * Activate a non-existent marker, this should be possible as the marker
>  	 * can be loaded at a later time.
>  	 */
> -	tap_ok(ustctl_set_marker_state(trace, "ustl", "blar", 1, pid) == 0,
> +	tap_ok(ustctl_set_marker_state(sock, trace, "ustl", "blar", 1) == 0,
>  	       "Enable non-existent marker ustl blar");
>  
>  	printf("##### Tests that definetly should work are completed #####\n");
>  	printf("############## Start expected failure cases ##############\n");
>  
> -	tap_ok(ustctl_set_marker_state(trace, "ust","bar", 1, pid),
> +	tap_ok(ustctl_set_marker_state(sock, trace, "ust","bar", 1),
>  	       "Enable already enabled marker ust/bar");
> +
>  	tap_ok(EEXIST == errno,
>  	       "Right error code for enabling an already enabled marker");
>  
> -	tap_ok(ustctl_start_trace(trace, pid),
> +	tap_ok(ustctl_start_trace(sock, trace),
>  	       "Start a non-existent trace");
>  
> -	tap_ok(ustctl_destroy_trace(trace, pid),
> +	tap_ok(ustctl_destroy_trace(sock, trace),
>  	       "Destroy non-existent trace");
>  
>  	exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS);
> @@ -167,7 +171,7 @@ int main(int argc, char **argv)
>  	int i, status;
>  	pid_t parent_pid, child_pid;
>  
> -	tap_plan(28);
> +	tap_plan(29);
>  
>  	printf("Function tests for ustctl\n");
>  
> diff --git a/ustctl/channel_cmds.c b/ustctl/channel_cmds.c
> index 2ccf460..315fd56 100644
> --- a/ustctl/channel_cmds.c
> +++ b/ustctl/channel_cmds.c
> @@ -24,12 +24,11 @@
>  
>  static int set_subbuf_size(int argc, char *argv[])
>  {
> -	int result = 0;
> -	pid_t pid;
> +	int sock, result = 0;
>  	char *channel = NULL;
>  	unsigned int size;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
>  	if (scan_ch_and_num(argv[3], &channel, &size)) {
>  		fprintf(stderr, "Failed to scan channel and size from"
> @@ -38,10 +37,10 @@ static int set_subbuf_size(int argc, char *argv[])
>  			free(channel);
>  		return -1;
>  	}
> -	if (ustctl_set_subbuf_size(argv[2], channel, size, pid)) {
> +	if (ustctl_set_subbuf_size(sock, argv[2], channel, size)) {
>  		ERR("error while trying to set the size of subbuffers "
> -		    "for PID %u\n",
> -		    pid);
> +		    "for PID %s\n",
> +		    argv[1]);
>  		result = -1;
>  	}
>  
> @@ -52,12 +51,11 @@ static int set_subbuf_size(int argc, char *argv[])
>  
>  static int set_subbuf_num(int argc, char *argv[])
>  {
> -	int result = 0;
> -	pid_t pid;
> +	int sock, result = 0;
>  	char *channel = NULL;
>  	unsigned int num;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
>  	if (scan_ch_and_num(argv[3], &channel, &num)) {
>  		fprintf(stderr, "Failed to scan channel and number from"
> @@ -66,9 +64,9 @@ static int set_subbuf_num(int argc, char *argv[])
>  			free(channel);
>  		return -1;
>  	}
> -	if (ustctl_set_subbuf_num(argv[2], channel, num, pid)) {
> -		ERR("error while trying to set the number of subbuffers for PID %u\n",
> -		    pid);
> +	if (ustctl_set_subbuf_num(sock, argv[2], channel, num)) {
> +		ERR("error while trying to set the number of subbuffers for PID %s\n",
> +		    argv[1]);
>  		result = -1;
>  	}
>  
> @@ -79,14 +77,14 @@ static int set_subbuf_num(int argc, char *argv[])
>  
>  static int get_subbuf_size(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  	unsigned int size;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if ((size = ustctl_get_subbuf_size(argv[2], argv[3], pid)) < 0) {
> -		ERR("error while trying to get the subbuffer size from PID %u\n",
> -		    pid);
> +	if ((size = ustctl_get_subbuf_size(sock, argv[2], argv[3])) < 0) {
> +		ERR("error while trying to get the subbuffer size from PID %s\n",
> +		    argv[1]);
>  		return -1;
>  	}
>  
> @@ -97,14 +95,14 @@ static int get_subbuf_size(int argc, char *argv[])
>  
>  static int get_subbuf_num(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  	unsigned int num;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if ((num = ustctl_get_subbuf_num(argv[2], argv[3], pid)) < 0) {
> -		ERR("error while trying to get the subbuffer size from PID %u\n",
> -		    pid);
> +	if ((num = ustctl_get_subbuf_num(sock, argv[2], argv[3])) < 0) {
> +		ERR("error while trying to get the subbuffer size from PID %s\n",
> +		    argv[1]);
>  		return -1;
>  	}
>  
> diff --git a/ustctl/marker_cmds.c b/ustctl/marker_cmds.c
> index 6544669..da14358 100644
> --- a/ustctl/marker_cmds.c
> +++ b/ustctl/marker_cmds.c
> @@ -25,19 +25,18 @@
>  static int list_markers(int argc, char *argv[])
>  {
>  	struct marker_status *cmsf = NULL;
> -	int i;
> -	pid_t pid;
> +	int i, sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_get_cmsf(&cmsf, pid)) {
> -		ERR("error while trying to list markers for PID %u\n", pid);
> +	if (ustctl_get_cmsf(sock, &cmsf)) {
> +		ERR("error while trying to list markers for PID %s\n", argv[1]);
>  		return -1;
>  	}
>  	for (i = 0; cmsf[i].channel; i++) {
> -		printf("{PID: %u, channel/marker: %s/%s, "
> +		printf("{PID: %s, channel/marker: %s/%s, "
>  		       "state: %u, fmt: %s}\n",
> -		       (unsigned int) pid,
> +		       argv[1],
>  		       cmsf[i].channel,
>  		       cmsf[i].marker,
>  		       cmsf[i].state,
> @@ -49,11 +48,10 @@ static int list_markers(int argc, char *argv[])
>  
>  static int enable_marker(int argc, char *argv[])
>  {
> -	int i, result = 0;
> -	pid_t pid;
> +	int i, sock, result = 0;
>  	char *channel, *marker;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
>  	for (i = 3; i < argc; i++) {
>  		channel = NULL;
> @@ -68,9 +66,9 @@ static int enable_marker(int argc, char *argv[])
>  			if (marker)
>  				free(marker);
>  		}
> -		if (ustctl_set_marker_state(argv[2], channel, marker, 1, pid)) {
> -			PERROR("error while trying to enable marker %s with PID %u",
> -			       argv[i], pid);
> +		if (ustctl_set_marker_state(sock, argv[2], channel, marker, 1)) {
> +			PERROR("error while trying to enable marker %s with PID %s",
> +			       argv[i], argv[1]);
>  			result = -1;
>  		}
>  		free(channel);
> @@ -82,11 +80,10 @@ static int enable_marker(int argc, char *argv[])
>  
>  static int disable_marker(int argc, char *argv[])
>  {
> -	int i, result = 0;
> -	pid_t pid;
> +	int i, sock, result = 0;
>  	char *channel, *marker;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
>  	for (i = 3; i < argc; i++) {
>  		channel = NULL;
> @@ -101,9 +98,9 @@ static int disable_marker(int argc, char *argv[])
>  				free(marker);
>  			return -1;
>  		}
> -		if (ustctl_set_marker_state(argv[2], channel, marker, 0, pid)) {
> -			PERROR("error while trying to disable marker %s with PID %u",
> -			       argv[i], pid);
> +		if (ustctl_set_marker_state(sock, argv[2], channel, marker, 0)) {
> +			PERROR("error while trying to disable marker %s with PID %s",
> +			       argv[i], argv[1]);
>  			result = -1;
>  		}
>  		free(channel);
> diff --git a/ustctl/scanning_functions.c b/ustctl/scanning_functions.c
> index a3eceb5..4aa8c1c 100644
> --- a/ustctl/scanning_functions.c
> +++ b/ustctl/scanning_functions.c
> @@ -21,9 +21,10 @@
>  #include "usterr.h"
>  
>  
> -pid_t parse_pid(const char *pid_string)
> +int parse_and_connect_pid(const char *pid_string)
>  {
>  	pid_t pid;
> +	int sock;
>  
>  	errno = 0;
>  	pid = strtoull(pid_string, NULL, 10);
> @@ -32,7 +33,13 @@ pid_t parse_pid(const char *pid_string)
>  		exit(EXIT_FAILURE);
>  	}
>  
> -	return pid;
> +	sock = ustctl_connect_pid(pid);
> +	if (sock < 0) {
> +		perror("Failed to connect to process");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	return sock;
>  }
>  
>  int scan_ch_marker(const char *channel_marker, char **channel, char **marker)
> diff --git a/ustctl/scanning_functions.h b/ustctl/scanning_functions.h
> index c37eba1..0f2d62e 100644
> --- a/ustctl/scanning_functions.h
> +++ b/ustctl/scanning_functions.h
> @@ -17,7 +17,7 @@
>  #ifndef __SCANNING_FUNCTIONS_H
>  #define __SCANNING_FUNCTIONS_H
>  
> -pid_t parse_pid(const char *pid_string);
> +int parse_and_connect_pid(const char *pid_string);
>  
>  int scan_ch_marker(const char *channel_marker, char **channel, char **marker);
>  
> diff --git a/ustctl/trace_cmds.c b/ustctl/trace_cmds.c
> index 020e5b2..74e4660 100644
> --- a/ustctl/trace_cmds.c
> +++ b/ustctl/trace_cmds.c
> @@ -25,12 +25,12 @@
>  
>  static int create_trace(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_create_trace(argv[2], pid)) {
> -		ERR("Failed to create trace %s for PID %u\n", argv[2], pid);
> +	if (ustctl_create_trace(sock, argv[2])) {
> +		ERR("Failed to create trace %s for PID %u\n", argv[2], argv[1]);
>  		return -1;
>  	}
>  
> @@ -39,12 +39,12 @@ static int create_trace(int argc, char *argv[])
>  
>  static int alloc_trace(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_alloc_trace(argv[2], pid)) {
> -		ERR("Failed to allocate trace %s for PID %u\n", argv[2], pid);
> +	if (ustctl_alloc_trace(sock, argv[2])) {
> +		ERR("Failed to allocate trace %s for PID %s\n", argv[2], argv[1]);
>  		return -1;
>  	}
>  	return 0;
> @@ -52,12 +52,12 @@ static int alloc_trace(int argc, char *argv[])
>  
>  static int start_trace(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_start_trace(argv[2], pid)) {
> -		ERR("Failed to start trace %s for PID %u\n", argv[2], pid);
> +	if (ustctl_start_trace(sock, argv[2])) {
> +		ERR("Failed to start trace %s for PID %s\n", argv[2], argv[1]);
>  		return -1;
>  	}
>  	return 0;
> @@ -65,12 +65,12 @@ static int start_trace(int argc, char *argv[])
>  
>  static int stop_trace(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_stop_trace(argv[2], pid)) {
> -		ERR("Failed to stop trace %s for PID %u\n", argv[2], pid);
> +	if (ustctl_stop_trace(sock, argv[2])) {
> +		ERR("Failed to stop trace %s for PID %s\n", argv[2], argv[1]);
>  		return -1;
>  	}
>  	return 0;
> @@ -78,12 +78,12 @@ static int stop_trace(int argc, char *argv[])
>  
>  static int destroy_trace(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_destroy_trace(argv[2], pid)) {
> -		ERR("Failed to destroy trace %s for PID %u\n", argv[2], pid);
> +	if (ustctl_destroy_trace(sock, argv[2])) {
> +		ERR("Failed to destroy trace %s for PID %s\n", argv[2], argv[1]);
>  		return -1;
>  	}
>  	return 0;
> @@ -91,12 +91,12 @@ static int destroy_trace(int argc, char *argv[])
>  
>  static int force_subbuf_switch(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_force_switch(pid)) {
> -		ERR("error while trying to force switch for PID %u\n", pid);
> +	if (ustctl_force_switch(sock, argv[2])) {
> +		ERR("error while trying to force switch for PID %s\n", argv[1]);
>  		return -1;
>  	}
>  
> diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c
> index c1bbe8c..b9acc23 100644
> --- a/ustctl/ustctl.c
> +++ b/ustctl/ustctl.c
> @@ -106,21 +106,20 @@ int main(int argc, char *argv[])
>  static int list_trace_events(int argc, char *argv[])
>  {
>  	struct trace_event_status *tes = NULL;
> -	int i;
> -	pid_t pid;
> +	int i, sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_get_tes(&tes, pid)) {
> +	if (ustctl_get_tes(sock, &tes)) {
>  		ERR("error while trying to list "
> -		    "trace_events for PID %u\n",
> -		    pid);
> +		    "trace_events for PID %s\n",
> +		    argv[1]);
>  		return -1;
>  	}
>  	i = 0;
>  	for (i = 0; tes[i].name; i++) {
> -		printf("{PID: %u, trace_event: %s}\n",
> -		       pid,
> +		printf("{PID: %s, trace_event: %s}\n",
> +		       argv[1],
>  		       tes[i].name);
>  	}
>  	ustctl_free_tes(tes);
> @@ -130,12 +129,12 @@ static int list_trace_events(int argc, char *argv[])
>  
>  static int set_sock_path(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_set_sock_path(argv[2], pid)) {
> -		ERR("error while trying to set sock path for PID %u\n", pid);
> +	if (ustctl_set_sock_path(sock, argv[2])) {
> +		ERR("error while trying to set sock path for PID %s\n", argv[1]);
>  		return -1;
>  	}
>  
> @@ -144,13 +143,13 @@ static int set_sock_path(int argc, char *argv[])
>  
>  static int get_sock_path(int argc, char *argv[])
>  {
> -	pid_t pid;
> +	int sock;
>  	char *sock_path;
>  
> -	pid = parse_pid(argv[1]);
> +	sock = parse_and_connect_pid(argv[1]);
>  
> -	if (ustctl_get_sock_path(&sock_path, pid)) {
> -		ERR("error while trying to get sock path for PID %u\n", pid);
> +	if (ustctl_get_sock_path(sock, &sock_path)) {
> +		ERR("error while trying to get sock path for PID %s\n", argv[1]);
>  		return -1;
>  	}
>  	printf("The socket path is %s\n", sock_path);
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ltt-dev] [UST PATCH] libustctl: use direct socket communication
       [not found] ` <BLU0-SMTP78C50A8553DE923A970DA096DA0@phx.gbl>
@ 2011-02-25  8:42   ` Nils Carlson
  0 siblings, 0 replies; 3+ messages in thread
From: Nils Carlson @ 2011-02-25  8:42 UTC (permalink / raw)


and merged.

/Nils

On Thu, 24 Feb 2011, Mathieu Desnoyers wrote:

> * Nils Carlson (nils.carlson at ericsson.com) wrote:
>> This patch changes libustctl to be socket instead of pid oriented.
>> The user is expected to connect to a pid using
>> ustctl_connect_pid(pid_t) which returns a socket file-descriptor and
>> then use the socket for the rest of the api. This reduces the amount
>> of open and closing systemcalls and also makes it possible for a
>> session daemon to detect process shutdown by the socket closing.
>
> Looks good! Thanks!
>
> Acked-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
>
>>
>> David, this ones for you. :-)
>>
>> Signed-off-by: Nils Carlson <nils.carlson at ericsson.com>
>> ---
>>  include/ust/ustctl.h                               |   66 ++++++---
>>  libustctl/libustctl.c                              |  150 +++++++++-----------
>>  .../libustctl_function_tests.c                     |   58 ++++----
>>  ustctl/channel_cmds.c                              |   42 +++---
>>  ustctl/marker_cmds.c                               |   35 ++---
>>  ustctl/scanning_functions.c                        |   11 ++-
>>  ustctl/scanning_functions.h                        |    2 +-
>>  ustctl/trace_cmds.c                                |   48 +++---
>>  ustctl/ustctl.c                                    |   31 ++--
>>  9 files changed, 229 insertions(+), 214 deletions(-)
>>
>> diff --git a/include/ust/ustctl.h b/include/ust/ustctl.h
>> index 195ee26..35f7617 100644
>> --- a/include/ust/ustctl.h
>> +++ b/include/ust/ustctl.h
>> @@ -48,29 +48,51 @@ struct trace_event_status {
>>  };
>>
>>  extern pid_t *ustctl_get_online_pids(void);
>> -extern int ustctl_set_marker_state(const char *trace, const char *channel,
>> -                                const char *marker, int state, pid_t pid);
>> -extern int ustctl_set_subbuf_size(const char *trace, const char *channel,
>> -                               unsigned int subbuf_size, pid_t pid);
>> -extern int ustctl_set_subbuf_num(const char *trace, const char *channel,
>> -                              unsigned int num, pid_t pid);
>> -extern int ustctl_get_subbuf_size(const char *trace, const char *channel,
>> -                               pid_t pid);
>> -extern int ustctl_get_subbuf_num(const char *trace, const char *channel,
>> -                              pid_t pid);
>> -extern int ustctl_destroy_trace(const char *trace, pid_t pid);
>> -extern int ustctl_setup_and_start(const char *trace, pid_t pid);
>> -extern int ustctl_stop_trace(const char *trace, pid_t pid);
>> -extern int ustctl_create_trace(const char *trace, pid_t pid);
>> -extern int ustctl_start_trace(const char *trace, pid_t pid);
>> -extern int ustctl_alloc_trace(const char *trace, pid_t pid);
>> +
>> +extern int ustctl_connect_pid(pid_t pid);
>> +
>> +extern int ustctl_set_marker_state(int sock, const char *trace,
>> +                                const char *channel, const char *marker,
>> +                                int state);
>> +
>> +extern int ustctl_set_subbuf_size(int sock, const char *trace,
>> +                               const char *channel,
>> +                               unsigned int subbuf_size);
>> +
>> +extern int ustctl_set_subbuf_num(int sock, const char *trace,
>> +                              const char *channel,
>> +                              unsigned int num);
>> +
>> +extern int ustctl_get_subbuf_size(int sock, const char *trace,
>> +                               const char *channel);
>> +
>> +extern int ustctl_get_subbuf_num(pid_t pid, const char *trace,
>> +                              const char *channel);
>> +
>> +extern int ustctl_destroy_trace(int sock, const char *trace);
>> +
>> +extern int ustctl_setup_and_start(int sock, const char *trace);
>> +
>> +extern int ustctl_stop_trace(int sock, const char *trace);
>> +
>> +extern int ustctl_create_trace(int sock, const char *trace);
>> +
>> +extern int ustctl_start_trace(int sock, const char *trace);
>> +
>> +extern int ustctl_alloc_trace(int sock, const char *trace);
>> +
>>  extern int ustctl_free_cmsf(struct marker_status *);
>> -extern unsigned int ustctl_count_nl(const char *);
>> -extern int ustctl_get_cmsf(struct marker_status **, pid_t);
>>  extern int ustctl_free_tes(struct trace_event_status *);
>> -extern int ustctl_get_tes(struct trace_event_status **, pid_t);
>> -extern int ustctl_set_sock_path(const char *sock_path, pid_t pid);
>> -extern int ustctl_get_sock_path(char **sock_path, pid_t pid);
>> -extern int ustctl_force_switch(pid_t pid);
>> +extern unsigned int ustctl_count_nl(const char *);
>> +
>> +extern int ustctl_get_cmsf(int sock, struct marker_status **);
>> +
>> +extern int ustctl_get_tes(int sock, struct trace_event_status **);
>> +
>> +extern int ustctl_set_sock_path(int sock, const char *sock_path);
>> +
>> +extern int ustctl_get_sock_path(int sock, char **sock_path);
>> +
>> +extern int ustctl_force_switch(int sock, const char *trace);
>>
>>  #endif /* _USTCTL_H */
>> diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c
>> index 9c4ced2..e9709c5 100644
>> --- a/libustctl/libustctl.c
>> +++ b/libustctl/libustctl.c
>> @@ -1,4 +1,5 @@
>>  /* Copyright (C) 2009  Pierre-Marc Fournier, Philippe Proulx-Barrette
>> + * Copyright (C) 2011  Ericsson AB
>>   *
>>   * This library is free software; you can redistribute it and/or
>>   * modify it under the terms of the GNU Lesser General Public
>> @@ -28,28 +29,22 @@
>>  #include "ust/ustctl.h"
>>  #include "usterr.h"
>>
>> -static int do_cmd(const pid_t pid,
>> +static int do_cmd(int sock,
>>                 const struct ustcomm_header *req_header,
>>                 const char *req_data,
>>                 struct ustcomm_header *res_header,
>>                 char **res_data)
>>  {
>> -     int app_fd, result, saved_errno = 0;
>> +     int result, saved_errno = 0;
>>       char *recv_buf;
>>
>> -     if (ustcomm_connect_app(pid, &app_fd)) {
>> -             ERR("could not connect to PID %u", (unsigned int) pid);
>> -             errno = ENOTCONN;
>> -             return -1;
>> -     }
>> -
>>       recv_buf = zmalloc(USTCOMM_BUFFER_SIZE);
>>       if (!recv_buf) {
>>               saved_errno = ENOMEM;
>> -             goto close_app_fd;
>> +             goto out;
>>       }
>>
>> -     result = ustcomm_req(app_fd, req_header, req_data, res_header, recv_buf);
>> +     result = ustcomm_req(sock, req_header, req_data, res_header, recv_buf);
>>       if (result > 0) {
>>               saved_errno = -res_header->result;
>>               if (res_header->size == 0 || saved_errno > 0) {
>> @@ -71,11 +66,8 @@ static int do_cmd(const pid_t pid,
>>               free(recv_buf);
>>       }
>>
>> -close_app_fd:
>> -     close(app_fd);
>> -
>> +out:
>>       errno = saved_errno;
>> -
>>       if (errno) {
>>               return -1;
>>       }
>> @@ -83,6 +75,19 @@ close_app_fd:
>>       return 0;
>>  }
>>
>> +int ustctl_connect_pid(pid_t pid)
>> +{
>> +     int sock;
>> +
>> +     if (ustcomm_connect_app(pid, &sock)) {
>> +             ERR("could not connect to PID %u", (unsigned int) pid);
>> +             errno = ENOTCONN;
>> +             return -1;
>> +     }
>> +
>> +     return sock;
>> +}
>> +
>>  pid_t *ustctl_get_online_pids(void)
>>  {
>>       struct dirent *dirent;
>> @@ -140,8 +145,8 @@ pid_t *ustctl_get_online_pids(void)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or errors {USTCTL_ERR_GEN, USTCTL_ERR_ARG}
>>   */
>> -int ustctl_set_marker_state(const char *trace, const char *channel,
>> -                         const char *marker, int state, pid_t pid)
>> +int ustctl_set_marker_state(int sock, const char *trace, const char *channel,
>> +                         const char *marker, int state)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       struct ustcomm_marker_info marker_inf;
>> @@ -159,7 +164,7 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
>>
>>       req_header.command = state ? ENABLE_MARKER : DISABLE_MARKER;
>>
>> -     return do_cmd(pid, &req_header, (char *)&marker_inf,
>> +     return do_cmd(sock, &req_header, (char *)&marker_inf,
>>                     &res_header, NULL);
>>  }
>>
>> @@ -170,8 +175,8 @@ int ustctl_set_marker_state(const char *trace, const char *channel,
>>   * @param pid                Traced process ID
>>   * @return           0 if successful, or error
>>   */
>> -int ustctl_set_subbuf_size(const char *trace, const char *channel,
>> -                        unsigned int subbuf_size, pid_t pid)
>> +int ustctl_set_subbuf_size(int sock, const char *trace, const char *channel,
>> +                        unsigned int subbuf_size)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       struct ustcomm_channel_info ch_inf;
>> @@ -189,7 +194,7 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
>>       req_header.command = SET_SUBBUF_SIZE;
>>       ch_inf.subbuf_size = subbuf_size;
>>
>> -     return do_cmd(pid, &req_header, (char *)&ch_inf,
>> +     return do_cmd(sock, &req_header, (char *)&ch_inf,
>>                     &res_header, NULL);
>>  }
>>
>> @@ -200,8 +205,8 @@ int ustctl_set_subbuf_size(const char *trace, const char *channel,
>>   * @param pid                Traced process ID
>>   * @return           0 if successful, or error
>>   */
>> -int ustctl_set_subbuf_num(const char *trace, const char *channel,
>> -                       unsigned int num, pid_t pid)
>> +int ustctl_set_subbuf_num(int sock, const char *trace, const char *channel,
>> +                       unsigned int num)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       struct ustcomm_channel_info ch_inf;
>> @@ -219,13 +224,14 @@ int ustctl_set_subbuf_num(const char *trace, const char *channel,
>>       req_header.command = SET_SUBBUF_NUM;
>>       ch_inf.subbuf_num = num;
>>
>> -     return do_cmd(pid, &req_header, (char *)&ch_inf,
>> +     return do_cmd(sock, &req_header, (char *)&ch_inf,
>>                     &res_header, NULL);
>>
>>  }
>>
>> -static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
>> -                                   pid_t pid, int *num, int *size)
>> +
>> +static int ustctl_get_subbuf_num_size(int sock, const char *trace, const char *channel,
>> +                                   int *num, int *size)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       struct ustcomm_channel_info ch_inf, *ch_inf_res;
>> @@ -243,7 +249,7 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
>>
>>       req_header.command = GET_SUBBUF_NUM_SIZE;
>>
>> -     result = do_cmd(pid, &req_header, (char *)&ch_inf,
>> +     result = do_cmd(sock, &req_header, (char *)&ch_inf,
>>                       &res_header, (char **)&ch_inf_res);
>>       if (result < 0) {
>>               return -1;
>> @@ -264,11 +270,11 @@ static int ustctl_get_subbuf_num_size(const char *trace, const char *channel,
>>   * @param pid                Traced process ID
>>   * @return           subbuf cnf if successful, or error
>>   */
>> -int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
>> +int ustctl_get_subbuf_num(int sock, const char *trace, const char *channel)
>>  {
>>       int num, size, result;
>>
>> -     result = ustctl_get_subbuf_num_size(trace, channel, pid,
>> +     result = ustctl_get_subbuf_num_size(sock, trace, channel,
>>                                           &num, &size);
>>       if (result < 0) {
>>               errno = -result;
>> @@ -285,11 +291,11 @@ int ustctl_get_subbuf_num(const char *trace, const char *channel, pid_t pid)
>>   * @param pid                Traced process ID
>>   * @return           subbuf size if successful, or error
>>   */
>> -int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
>> +int ustctl_get_subbuf_size(int sock, const char *trace, const char *channel)
>>  {
>>       int num, size, result;
>>
>> -     result = ustctl_get_subbuf_num_size(trace, channel, pid,
>> +     result = ustctl_get_subbuf_num_size(sock, trace, channel,
>>                                           &num, &size);
>>       if (result < 0) {
>>               errno = -result;
>> @@ -299,8 +305,7 @@ int ustctl_get_subbuf_size(const char *trace, const char *channel, pid_t pid)
>>       return size;
>>  }
>>
>> -
>> -static int do_trace_cmd(const char *trace, pid_t pid, int command)
>> +static int do_trace_cmd(int sock, const char *trace, int command)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       struct ustcomm_single_field trace_inf;
>> @@ -316,7 +321,7 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
>>
>>       req_header.command = command;
>>
>> -     return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL);
>> +     return do_cmd(sock, &req_header, (char *)&trace_inf, &res_header, NULL);
>>  }
>>
>>  /**
>> @@ -325,9 +330,9 @@ static int do_trace_cmd(const char *trace, pid_t pid, int command)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_destroy_trace(const char *trace, pid_t pid)
>> +int ustctl_destroy_trace(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, DESTROY_TRACE);
>> +     return do_trace_cmd(sock, trace, DESTROY_TRACE);
>>  }
>>
>>  /**
>> @@ -336,9 +341,9 @@ int ustctl_destroy_trace(const char *trace, pid_t pid)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_setup_and_start(const char *trace, pid_t pid)
>> +int ustctl_setup_and_start(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, START);
>> +     return do_trace_cmd(sock, trace, START);
>>  }
>>
>>  /**
>> @@ -347,9 +352,9 @@ int ustctl_setup_and_start(const char *trace, pid_t pid)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_create_trace(const char *trace, pid_t pid)
>> +int ustctl_create_trace(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, CREATE_TRACE);
>> +     return do_trace_cmd(sock, trace, CREATE_TRACE);
>>  }
>>
>>  /**
>> @@ -358,9 +363,9 @@ int ustctl_create_trace(const char *trace, pid_t pid)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_start_trace(const char *trace, pid_t pid)
>> +int ustctl_start_trace(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, START_TRACE);
>> +     return do_trace_cmd(sock, trace, START_TRACE);
>>  }
>>
>>  /**
>> @@ -369,9 +374,9 @@ int ustctl_start_trace(const char *trace, pid_t pid)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_alloc_trace(const char *trace, pid_t pid)
>> +int ustctl_alloc_trace(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, ALLOC_TRACE);
>> +     return do_trace_cmd(sock, trace, ALLOC_TRACE);
>>  }
>>
>>  /**
>> @@ -380,9 +385,9 @@ int ustctl_alloc_trace(const char *trace, pid_t pid)
>>   * @param pid        Traced process ID
>>   * @return   0 if successful, or error USTCTL_ERR_GEN
>>   */
>> -int ustctl_stop_trace(const char *trace, pid_t pid)
>> +int ustctl_stop_trace(int sock, const char *trace)
>>  {
>> -     return do_trace_cmd(trace, pid, STOP_TRACE);
>> +     return do_trace_cmd(sock, trace, STOP_TRACE);
>>  }
>>
>>  /**
>> @@ -437,11 +442,11 @@ int ustctl_free_cmsf(struct marker_status *cmsf)
>>   * @param pid        Targeted PID
>>   * @return   0 if successful, or -1 on error
>>   */
>> -int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
>> +int ustctl_get_cmsf(int sock, struct marker_status **cmsf)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       char *big_str = NULL;
>> -     int result, app_fd;
>> +     int result;
>>       struct marker_status *tmp_cmsf = NULL;
>>       unsigned int i = 0, cmsf_ind = 0;
>>
>> @@ -449,28 +454,21 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
>>               return -1;
>>       }
>>
>> -     if (ustcomm_connect_app(pid, &app_fd)) {
>> -             ERR("could not connect to PID %u", (unsigned int) pid);
>> -             return -1;
>> -     }
>> -
>>       req_header.command = LIST_MARKERS;
>>       req_header.size = 0;
>>
>> -     result = ustcomm_send(app_fd, &req_header, NULL);
>> +     result = ustcomm_send(sock, &req_header, NULL);
>>       if (result <= 0) {
>> -             PERROR("error while requesting markers list for process %d", pid);
>> +             PERROR("error while requesting markers list");
>>               return -1;
>>       }
>>
>> -     result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
>> +     result = ustcomm_recv_alloc(sock, &res_header, &big_str);
>>       if (result <= 0) {
>>               ERR("error while receiving markers list");
>>               return -1;
>>       }
>>
>> -     close(app_fd);
>> -
>>       tmp_cmsf = (struct marker_status *) zmalloc(sizeof(struct marker_status) *
>>                                                   (ustctl_count_nl(big_str) + 1));
>>       if (tmp_cmsf == NULL) {
>> @@ -506,7 +504,6 @@ int ustctl_get_cmsf(struct marker_status **cmsf, const pid_t pid)
>>       return 0;
>>  }
>>
>> -
>>  /**
>>   * Frees a TES array.
>>   *
>> @@ -537,12 +534,11 @@ int ustctl_free_tes(struct trace_event_status *tes)
>>   * @param pid        Targeted PID
>>   * @return   0 if successful, or -1 on error
>>   */
>> -int ustctl_get_tes(struct trace_event_status **tes,
>> -                const pid_t pid)
>> +int ustctl_get_tes(int sock, struct trace_event_status **tes)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>       char *big_str = NULL;
>> -     int result, app_fd;
>> +     int result;
>>       struct trace_event_status *tmp_tes = NULL;
>>       unsigned int i = 0, tes_ind = 0;
>>
>> @@ -550,28 +546,21 @@ int ustctl_get_tes(struct trace_event_status **tes,
>>               return -1;
>>       }
>>
>> -     if (ustcomm_connect_app(pid, &app_fd)) {
>> -             ERR("could not connect to PID %u", (unsigned int) pid);
>> -             return -1;
>> -     }
>> -
>>       req_header.command = LIST_TRACE_EVENTS;
>>       req_header.size = 0;
>>
>> -     result = ustcomm_send(app_fd, &req_header, NULL);
>> +     result = ustcomm_send(sock, &req_header, NULL);
>>       if (result != 1) {
>>               ERR("error while requesting trace_event list");
>>               return -1;
>>       }
>>
>> -     result = ustcomm_recv_alloc(app_fd, &res_header, &big_str);
>> +     result = ustcomm_recv_alloc(sock, &res_header, &big_str);
>>       if (result != 1) {
>>               ERR("error while receiving markers list");
>>               return -1;
>>       }
>>
>> -     close(app_fd);
>> -
>>       tmp_tes = (struct trace_event_status *)
>>               zmalloc(sizeof(struct trace_event_status) *
>>                       (ustctl_count_nl(big_str) + 1));
>> @@ -599,13 +588,13 @@ int ustctl_get_tes(struct trace_event_status **tes,
>>  }
>>
>>  /**
>> - * Set socket path
>> + * Set sock path
>>   *
>> - * @param sock_path  Socket path
>> + * @param sock_path  Sock path
>>   * @param pid                Traced process ID
>>   * @return           0 if successful, or error
>>   */
>> -int ustctl_set_sock_path(const char *sock_path, pid_t pid)
>> +int ustctl_set_sock_path(int sock, const char *sock_path)
>>  {
>>       int result;
>>       struct ustcomm_header req_header, res_header;
>> @@ -621,18 +610,18 @@ int ustctl_set_sock_path(const char *sock_path, pid_t pid)
>>
>>       req_header.command = SET_SOCK_PATH;
>>
>> -     return do_cmd(pid, &req_header, (char *)&sock_path_msg,
>> +     return do_cmd(sock, &req_header, (char *)&sock_path_msg,
>>                     &res_header, NULL);
>>  }
>>
>>  /**
>> - * Get socket path
>> + * Get sock path
>>   *
>> - * @param sock_path  Pointer to where the socket path will be returned
>> + * @param sock_path  Pointer to where the sock path will be returned
>>   * @param pid                Traced process ID
>>   * @return           0 if successful, or error
>>   */
>> -int ustctl_get_sock_path(char **sock_path, pid_t pid)
>> +int ustctl_get_sock_path(int sock, char **sock_path)
>>  {
>>       int result;
>>       struct ustcomm_header req_header, res_header;
>> @@ -641,7 +630,7 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
>>       req_header.command = GET_SOCK_PATH;
>>       req_header.size = 0;
>>
>> -     result = do_cmd(pid, &req_header, NULL, &res_header,
>> +     result = do_cmd(sock, &req_header, NULL, &res_header,
>>                       (char **)&sock_path_msg);
>>       if (result < 0) {
>>               return -1;
>> @@ -659,13 +648,12 @@ int ustctl_get_sock_path(char **sock_path, pid_t pid)
>>       return 0;
>>  }
>>
>> -int ustctl_force_switch(pid_t pid)
>> +int ustctl_force_switch(int sock, const char *trace)
>>  {
>>       struct ustcomm_header req_header, res_header;
>>
>>       req_header.command = FORCE_SUBBUF_SWITCH;
>>       req_header.size = 0;
>>
>> -     return do_cmd(pid, &req_header, NULL, &res_header, NULL);
>> +     return do_cmd(sock, &req_header, NULL, &res_header, NULL);
>>  }
>> -
>> diff --git a/tests/libustctl_function_tests/libustctl_function_tests.c b/tests/libustctl_function_tests/libustctl_function_tests.c
>> index 1461997..7406243 100644
>> --- a/tests/libustctl_function_tests/libustctl_function_tests.c
>> +++ b/tests/libustctl_function_tests/libustctl_function_tests.c
>> @@ -30,7 +30,7 @@
>>
>>  static void ustctl_function_tests(pid_t pid)
>>  {
>> -     int result;
>> +     int result, sock;
>>       unsigned int subbuf_size, subbuf_num;
>>       unsigned int new_subbuf_size, new_subbuf_num;
>>       struct marker_status *marker_status, *ms_ptr;
>> @@ -40,8 +40,11 @@ static void ustctl_function_tests(pid_t pid)
>>
>>       printf("Connecting to pid %d\n", pid);
>>
>> +     sock = ustctl_connect_pid(pid);
>> +     tap_ok(sock > 0, "ustctl_connect_pid");
>> +
>>       /* marker status array functions */
>> -     result = ustctl_get_cmsf(&marker_status, pid);
>> +     result = ustctl_get_cmsf(sock, &marker_status);
>>       tap_ok(!result, "ustctl_get_cmsf");
>>
>>       result = 0;
>> @@ -56,15 +59,15 @@ static void ustctl_function_tests(pid_t pid)
>>       tap_ok(!ustctl_free_cmsf(marker_status), "ustctl_free_cmsf");
>>
>>       /* Get and set the socket path */
>> -     tap_ok(!ustctl_get_sock_path(&old_socket_path, pid),
>> +     tap_ok(!ustctl_get_sock_path(sock, &old_socket_path),
>>              "ustctl_get_sock_path");
>>
>>       printf("Socket path: %s\n", old_socket_path);
>>
>> -     tap_ok(!ustctl_set_sock_path(tmp_ustd_socket, pid),
>> +     tap_ok(!ustctl_set_sock_path(sock, tmp_ustd_socket),
>>              "ustctl_set_sock_path - set a new path");
>>
>> -     tap_ok(!ustctl_get_sock_path(&new_socket_path, pid),
>> +     tap_ok(!ustctl_get_sock_path(sock, &new_socket_path),
>>              "ustctl_get_sock_path - get the new path");
>>
>>       tap_ok(!strcmp(new_socket_path, tmp_ustd_socket),
>> @@ -72,90 +75,91 @@ static void ustctl_function_tests(pid_t pid)
>>
>>       free(new_socket_path);
>>
>> -     tap_ok(!ustctl_set_sock_path(old_socket_path, pid),
>> +     tap_ok(!ustctl_set_sock_path(sock, old_socket_path),
>>              "Reset the socket path");
>>
>>       free(old_socket_path);
>>
>>       /* Enable, disable markers */
>> -     tap_ok(!ustctl_set_marker_state(trace, "ust", "bar", 1, pid),
>> +     tap_ok(!ustctl_set_marker_state(sock, trace, "ust", "bar", 1),
>>              "ustctl_set_marker_state - existing marker ust bar");
>>
>>       /* Create and allocate a trace */
>> -     tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace");
>> +     tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace");
>>
>> -     tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace");
>> +     tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace");
>>
>>       /* Get subbuf size and number */
>> -     subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
>> +     subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
>>       tap_ok(subbuf_num > 0, "ustctl_get_subbuf_num - %d sub-buffers",
>>              subbuf_num);
>>
>> -     subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
>> +     subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
>>       tap_ok(subbuf_size, "ustctl_get_subbuf_size - sub-buffer size is %d",
>>              subbuf_size);
>>
>>       /* Start the trace */
>> -     tap_ok(!ustctl_start_trace(trace, pid), "ustctl_start_trace");
>> +     tap_ok(!ustctl_start_trace(sock, trace), "ustctl_start_trace");
>>
>>
>>       /* Stop the trace and destroy it*/
>> -     tap_ok(!ustctl_stop_trace(trace, pid), "ustctl_stop_trace");
>> +     tap_ok(!ustctl_stop_trace(sock, trace), "ustctl_stop_trace");
>>
>> -     tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace");
>> +     tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace");
>>
>>       /* Create a new trace */
>> -     tap_ok(!ustctl_create_trace(trace, pid), "ustctl_create_trace - create a new trace");
>> +     tap_ok(!ustctl_create_trace(sock, trace), "ustctl_create_trace - create a new trace");
>>
>>       printf("Setting new subbufer number and sizes (doubling)\n");
>>       new_subbuf_num = 2 * subbuf_num;
>>       new_subbuf_size = 2 * subbuf_size;
>>
>> -     tap_ok(!ustctl_set_subbuf_num(trace, "ust", new_subbuf_num, pid),
>> +     tap_ok(!ustctl_set_subbuf_num(sock, trace, "ust", new_subbuf_num),
>>              "ustctl_set_subbuf_num");
>>
>> -     tap_ok(!ustctl_set_subbuf_size(trace, "ust", new_subbuf_size, pid),
>> +     tap_ok(!ustctl_set_subbuf_size(sock, trace, "ust", new_subbuf_size),
>>              "ustctl_set_subbuf_size");
>>
>>
>>       /* Allocate the new trace */
>> -     tap_ok(!ustctl_alloc_trace(trace, pid), "ustctl_alloc_trace - allocate the new trace");
>> +     tap_ok(!ustctl_alloc_trace(sock, trace), "ustctl_alloc_trace - allocate the new trace");
>>
>>
>>          /* Get subbuf size and number and compare with what was set */
>> -     subbuf_num = ustctl_get_subbuf_num(trace, "ust", pid);
>> +     subbuf_num = ustctl_get_subbuf_num(sock, trace, "ust");
>>
>> -     subbuf_size = ustctl_get_subbuf_size(trace, "ust", pid);
>> +     subbuf_size = ustctl_get_subbuf_size(sock, trace, "ust");
>>
>>       tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d",
>>              subbuf_num, new_subbuf_num);
>>
>>
>> -     result = ustctl_get_subbuf_size(trace, "ust", pid);
>> +     result = ustctl_get_subbuf_size(sock, trace, "ust");
>>       tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d",
>>              subbuf_size, new_subbuf_size);
>>
>> -     tap_ok(!ustctl_destroy_trace(trace, pid), "ustctl_destroy_trace - without ever starting");
>> +     tap_ok(!ustctl_destroy_trace(sock, trace), "ustctl_destroy_trace - without ever starting");
>>
>>       /*
>>        * Activate a non-existent marker, this should be possible as the marker
>>        * can be loaded at a later time.
>>        */
>> -     tap_ok(ustctl_set_marker_state(trace, "ustl", "blar", 1, pid) == 0,
>> +     tap_ok(ustctl_set_marker_state(sock, trace, "ustl", "blar", 1) == 0,
>>              "Enable non-existent marker ustl blar");
>>
>>       printf("##### Tests that definetly should work are completed #####\n");
>>       printf("############## Start expected failure cases ##############\n");
>>
>> -     tap_ok(ustctl_set_marker_state(trace, "ust","bar", 1, pid),
>> +     tap_ok(ustctl_set_marker_state(sock, trace, "ust","bar", 1),
>>              "Enable already enabled marker ust/bar");
>> +
>>       tap_ok(EEXIST == errno,
>>              "Right error code for enabling an already enabled marker");
>>
>> -     tap_ok(ustctl_start_trace(trace, pid),
>> +     tap_ok(ustctl_start_trace(sock, trace),
>>              "Start a non-existent trace");
>>
>> -     tap_ok(ustctl_destroy_trace(trace, pid),
>> +     tap_ok(ustctl_destroy_trace(sock, trace),
>>              "Destroy non-existent trace");
>>
>>       exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS);
>> @@ -167,7 +171,7 @@ int main(int argc, char **argv)
>>       int i, status;
>>       pid_t parent_pid, child_pid;
>>
>> -     tap_plan(28);
>> +     tap_plan(29);
>>
>>       printf("Function tests for ustctl\n");
>>
>> diff --git a/ustctl/channel_cmds.c b/ustctl/channel_cmds.c
>> index 2ccf460..315fd56 100644
>> --- a/ustctl/channel_cmds.c
>> +++ b/ustctl/channel_cmds.c
>> @@ -24,12 +24,11 @@
>>
>>  static int set_subbuf_size(int argc, char *argv[])
>>  {
>> -     int result = 0;
>> -     pid_t pid;
>> +     int sock, result = 0;
>>       char *channel = NULL;
>>       unsigned int size;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>>       if (scan_ch_and_num(argv[3], &channel, &size)) {
>>               fprintf(stderr, "Failed to scan channel and size from"
>> @@ -38,10 +37,10 @@ static int set_subbuf_size(int argc, char *argv[])
>>                       free(channel);
>>               return -1;
>>       }
>> -     if (ustctl_set_subbuf_size(argv[2], channel, size, pid)) {
>> +     if (ustctl_set_subbuf_size(sock, argv[2], channel, size)) {
>>               ERR("error while trying to set the size of subbuffers "
>> -                 "for PID %u\n",
>> -                 pid);
>> +                 "for PID %s\n",
>> +                 argv[1]);
>>               result = -1;
>>       }
>>
>> @@ -52,12 +51,11 @@ static int set_subbuf_size(int argc, char *argv[])
>>
>>  static int set_subbuf_num(int argc, char *argv[])
>>  {
>> -     int result = 0;
>> -     pid_t pid;
>> +     int sock, result = 0;
>>       char *channel = NULL;
>>       unsigned int num;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>>       if (scan_ch_and_num(argv[3], &channel, &num)) {
>>               fprintf(stderr, "Failed to scan channel and number from"
>> @@ -66,9 +64,9 @@ static int set_subbuf_num(int argc, char *argv[])
>>                       free(channel);
>>               return -1;
>>       }
>> -     if (ustctl_set_subbuf_num(argv[2], channel, num, pid)) {
>> -             ERR("error while trying to set the number of subbuffers for PID %u\n",
>> -                 pid);
>> +     if (ustctl_set_subbuf_num(sock, argv[2], channel, num)) {
>> +             ERR("error while trying to set the number of subbuffers for PID %s\n",
>> +                 argv[1]);
>>               result = -1;
>>       }
>>
>> @@ -79,14 +77,14 @@ static int set_subbuf_num(int argc, char *argv[])
>>
>>  static int get_subbuf_size(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>       unsigned int size;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if ((size = ustctl_get_subbuf_size(argv[2], argv[3], pid)) < 0) {
>> -             ERR("error while trying to get the subbuffer size from PID %u\n",
>> -                 pid);
>> +     if ((size = ustctl_get_subbuf_size(sock, argv[2], argv[3])) < 0) {
>> +             ERR("error while trying to get the subbuffer size from PID %s\n",
>> +                 argv[1]);
>>               return -1;
>>       }
>>
>> @@ -97,14 +95,14 @@ static int get_subbuf_size(int argc, char *argv[])
>>
>>  static int get_subbuf_num(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>       unsigned int num;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if ((num = ustctl_get_subbuf_num(argv[2], argv[3], pid)) < 0) {
>> -             ERR("error while trying to get the subbuffer size from PID %u\n",
>> -                 pid);
>> +     if ((num = ustctl_get_subbuf_num(sock, argv[2], argv[3])) < 0) {
>> +             ERR("error while trying to get the subbuffer size from PID %s\n",
>> +                 argv[1]);
>>               return -1;
>>       }
>>
>> diff --git a/ustctl/marker_cmds.c b/ustctl/marker_cmds.c
>> index 6544669..da14358 100644
>> --- a/ustctl/marker_cmds.c
>> +++ b/ustctl/marker_cmds.c
>> @@ -25,19 +25,18 @@
>>  static int list_markers(int argc, char *argv[])
>>  {
>>       struct marker_status *cmsf = NULL;
>> -     int i;
>> -     pid_t pid;
>> +     int i, sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_get_cmsf(&cmsf, pid)) {
>> -             ERR("error while trying to list markers for PID %u\n", pid);
>> +     if (ustctl_get_cmsf(sock, &cmsf)) {
>> +             ERR("error while trying to list markers for PID %s\n", argv[1]);
>>               return -1;
>>       }
>>       for (i = 0; cmsf[i].channel; i++) {
>> -             printf("{PID: %u, channel/marker: %s/%s, "
>> +             printf("{PID: %s, channel/marker: %s/%s, "
>>                      "state: %u, fmt: %s}\n",
>> -                    (unsigned int) pid,
>> +                    argv[1],
>>                      cmsf[i].channel,
>>                      cmsf[i].marker,
>>                      cmsf[i].state,
>> @@ -49,11 +48,10 @@ static int list_markers(int argc, char *argv[])
>>
>>  static int enable_marker(int argc, char *argv[])
>>  {
>> -     int i, result = 0;
>> -     pid_t pid;
>> +     int i, sock, result = 0;
>>       char *channel, *marker;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>>       for (i = 3; i < argc; i++) {
>>               channel = NULL;
>> @@ -68,9 +66,9 @@ static int enable_marker(int argc, char *argv[])
>>                       if (marker)
>>                               free(marker);
>>               }
>> -             if (ustctl_set_marker_state(argv[2], channel, marker, 1, pid)) {
>> -                     PERROR("error while trying to enable marker %s with PID %u",
>> -                            argv[i], pid);
>> +             if (ustctl_set_marker_state(sock, argv[2], channel, marker, 1)) {
>> +                     PERROR("error while trying to enable marker %s with PID %s",
>> +                            argv[i], argv[1]);
>>                       result = -1;
>>               }
>>               free(channel);
>> @@ -82,11 +80,10 @@ static int enable_marker(int argc, char *argv[])
>>
>>  static int disable_marker(int argc, char *argv[])
>>  {
>> -     int i, result = 0;
>> -     pid_t pid;
>> +     int i, sock, result = 0;
>>       char *channel, *marker;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>>       for (i = 3; i < argc; i++) {
>>               channel = NULL;
>> @@ -101,9 +98,9 @@ static int disable_marker(int argc, char *argv[])
>>                               free(marker);
>>                       return -1;
>>               }
>> -             if (ustctl_set_marker_state(argv[2], channel, marker, 0, pid)) {
>> -                     PERROR("error while trying to disable marker %s with PID %u",
>> -                            argv[i], pid);
>> +             if (ustctl_set_marker_state(sock, argv[2], channel, marker, 0)) {
>> +                     PERROR("error while trying to disable marker %s with PID %s",
>> +                            argv[i], argv[1]);
>>                       result = -1;
>>               }
>>               free(channel);
>> diff --git a/ustctl/scanning_functions.c b/ustctl/scanning_functions.c
>> index a3eceb5..4aa8c1c 100644
>> --- a/ustctl/scanning_functions.c
>> +++ b/ustctl/scanning_functions.c
>> @@ -21,9 +21,10 @@
>>  #include "usterr.h"
>>
>>
>> -pid_t parse_pid(const char *pid_string)
>> +int parse_and_connect_pid(const char *pid_string)
>>  {
>>       pid_t pid;
>> +     int sock;
>>
>>       errno = 0;
>>       pid = strtoull(pid_string, NULL, 10);
>> @@ -32,7 +33,13 @@ pid_t parse_pid(const char *pid_string)
>>               exit(EXIT_FAILURE);
>>       }
>>
>> -     return pid;
>> +     sock = ustctl_connect_pid(pid);
>> +     if (sock < 0) {
>> +             perror("Failed to connect to process");
>> +             exit(EXIT_FAILURE);
>> +     }
>> +
>> +     return sock;
>>  }
>>
>>  int scan_ch_marker(const char *channel_marker, char **channel, char **marker)
>> diff --git a/ustctl/scanning_functions.h b/ustctl/scanning_functions.h
>> index c37eba1..0f2d62e 100644
>> --- a/ustctl/scanning_functions.h
>> +++ b/ustctl/scanning_functions.h
>> @@ -17,7 +17,7 @@
>>  #ifndef __SCANNING_FUNCTIONS_H
>>  #define __SCANNING_FUNCTIONS_H
>>
>> -pid_t parse_pid(const char *pid_string);
>> +int parse_and_connect_pid(const char *pid_string);
>>
>>  int scan_ch_marker(const char *channel_marker, char **channel, char **marker);
>>
>> diff --git a/ustctl/trace_cmds.c b/ustctl/trace_cmds.c
>> index 020e5b2..74e4660 100644
>> --- a/ustctl/trace_cmds.c
>> +++ b/ustctl/trace_cmds.c
>> @@ -25,12 +25,12 @@
>>
>>  static int create_trace(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_create_trace(argv[2], pid)) {
>> -             ERR("Failed to create trace %s for PID %u\n", argv[2], pid);
>> +     if (ustctl_create_trace(sock, argv[2])) {
>> +             ERR("Failed to create trace %s for PID %u\n", argv[2], argv[1]);
>>               return -1;
>>       }
>>
>> @@ -39,12 +39,12 @@ static int create_trace(int argc, char *argv[])
>>
>>  static int alloc_trace(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_alloc_trace(argv[2], pid)) {
>> -             ERR("Failed to allocate trace %s for PID %u\n", argv[2], pid);
>> +     if (ustctl_alloc_trace(sock, argv[2])) {
>> +             ERR("Failed to allocate trace %s for PID %s\n", argv[2], argv[1]);
>>               return -1;
>>       }
>>       return 0;
>> @@ -52,12 +52,12 @@ static int alloc_trace(int argc, char *argv[])
>>
>>  static int start_trace(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_start_trace(argv[2], pid)) {
>> -             ERR("Failed to start trace %s for PID %u\n", argv[2], pid);
>> +     if (ustctl_start_trace(sock, argv[2])) {
>> +             ERR("Failed to start trace %s for PID %s\n", argv[2], argv[1]);
>>               return -1;
>>       }
>>       return 0;
>> @@ -65,12 +65,12 @@ static int start_trace(int argc, char *argv[])
>>
>>  static int stop_trace(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_stop_trace(argv[2], pid)) {
>> -             ERR("Failed to stop trace %s for PID %u\n", argv[2], pid);
>> +     if (ustctl_stop_trace(sock, argv[2])) {
>> +             ERR("Failed to stop trace %s for PID %s\n", argv[2], argv[1]);
>>               return -1;
>>       }
>>       return 0;
>> @@ -78,12 +78,12 @@ static int stop_trace(int argc, char *argv[])
>>
>>  static int destroy_trace(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_destroy_trace(argv[2], pid)) {
>> -             ERR("Failed to destroy trace %s for PID %u\n", argv[2], pid);
>> +     if (ustctl_destroy_trace(sock, argv[2])) {
>> +             ERR("Failed to destroy trace %s for PID %s\n", argv[2], argv[1]);
>>               return -1;
>>       }
>>       return 0;
>> @@ -91,12 +91,12 @@ static int destroy_trace(int argc, char *argv[])
>>
>>  static int force_subbuf_switch(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_force_switch(pid)) {
>> -             ERR("error while trying to force switch for PID %u\n", pid);
>> +     if (ustctl_force_switch(sock, argv[2])) {
>> +             ERR("error while trying to force switch for PID %s\n", argv[1]);
>>               return -1;
>>       }
>>
>> diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c
>> index c1bbe8c..b9acc23 100644
>> --- a/ustctl/ustctl.c
>> +++ b/ustctl/ustctl.c
>> @@ -106,21 +106,20 @@ int main(int argc, char *argv[])
>>  static int list_trace_events(int argc, char *argv[])
>>  {
>>       struct trace_event_status *tes = NULL;
>> -     int i;
>> -     pid_t pid;
>> +     int i, sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_get_tes(&tes, pid)) {
>> +     if (ustctl_get_tes(sock, &tes)) {
>>               ERR("error while trying to list "
>> -                 "trace_events for PID %u\n",
>> -                 pid);
>> +                 "trace_events for PID %s\n",
>> +                 argv[1]);
>>               return -1;
>>       }
>>       i = 0;
>>       for (i = 0; tes[i].name; i++) {
>> -             printf("{PID: %u, trace_event: %s}\n",
>> -                    pid,
>> +             printf("{PID: %s, trace_event: %s}\n",
>> +                    argv[1],
>>                      tes[i].name);
>>       }
>>       ustctl_free_tes(tes);
>> @@ -130,12 +129,12 @@ static int list_trace_events(int argc, char *argv[])
>>
>>  static int set_sock_path(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_set_sock_path(argv[2], pid)) {
>> -             ERR("error while trying to set sock path for PID %u\n", pid);
>> +     if (ustctl_set_sock_path(sock, argv[2])) {
>> +             ERR("error while trying to set sock path for PID %s\n", argv[1]);
>>               return -1;
>>       }
>>
>> @@ -144,13 +143,13 @@ static int set_sock_path(int argc, char *argv[])
>>
>>  static int get_sock_path(int argc, char *argv[])
>>  {
>> -     pid_t pid;
>> +     int sock;
>>       char *sock_path;
>>
>> -     pid = parse_pid(argv[1]);
>> +     sock = parse_and_connect_pid(argv[1]);
>>
>> -     if (ustctl_get_sock_path(&sock_path, pid)) {
>> -             ERR("error while trying to get sock path for PID %u\n", pid);
>> +     if (ustctl_get_sock_path(sock, &sock_path)) {
>> +             ERR("error while trying to get sock path for PID %s\n", argv[1]);
>>               return -1;
>>       }
>>       printf("The socket path is %s\n", sock_path);
>> --
>> 1.7.1
>>
>>
>> _______________________________________________
>> ltt-dev mailing list
>> ltt-dev at lists.casi.polymtl.ca
>> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
>>
>
> --
> Mathieu Desnoyers
> Operating System Efficiency R&D Consultant
> EfficiOS Inc.
> http://www.efficios.com
>



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-02-25  8:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-24 12:26 [ltt-dev] [UST PATCH] libustctl: use direct socket communication Nils Carlson
2011-02-24 12:33 ` Mathieu Desnoyers
     [not found] ` <BLU0-SMTP78C50A8553DE923A970DA096DA0@phx.gbl>
2011-02-25  8:42   ` Nils Carlson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox