X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=2fd6222999faeaae1833e4acb8e53f0c79d2e1c1;hp=450a6ffc8c075c4f905fd465f6298c8add38a760;hb=5b97ec606d485e091cf2c2bc06b79f05d18212aa;hpb=3f9947db38d28a772b76dc63ab5688ef4037b107 diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 450a6ffc8..2fd622299 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -35,7 +35,7 @@ #include /* URCU list library (-lurcu) */ #include /* UST control lib (-lust) */ -#include +#include #include "liblttsessiondcomm.h" #include "ltt-sessiond.h" @@ -101,6 +101,8 @@ static void *thread_manage_apps(void *data) uid_t uid; } reg_msg; + DBG("[thread] Manage apps started"); + /* Notify all applications to register */ notify_apps(default_global_apps_pipe); @@ -157,6 +159,8 @@ static void *thread_manage_clients(void *data) int sock, ret; struct lttcomm_session_msg lsm; + DBG("[thread] Manage client started"); + ret = lttcomm_listen_unix_sock(client_socket); if (ret < 0) { goto error; @@ -233,6 +237,8 @@ static int connect_app(pid_t pid) int sock; struct ltt_traceable_app *lta; + DBG("Connect to application pid %d", pid); + lta = find_app_by_pid(pid); if (lta == NULL) { /* App not found */ @@ -261,6 +267,8 @@ static int notify_apps(const char *name) int fd; int ret = -1; + DBG("Notify the global application pipe"); + /* Try opening the global pipe */ fd = open(name, O_WRONLY); if (fd < 0) { @@ -289,6 +297,8 @@ static int ust_create_trace(pid_t pid) int sock, ret; struct ltt_ust_trace *trace; + DBG("Creating trace for pid %d", pid); + trace = malloc(sizeof(struct ltt_ust_trace)); if (trace == NULL) { perror("malloc"); @@ -299,6 +309,11 @@ static int ust_create_trace(pid_t pid) /* Init */ trace->pid = pid; trace->shmid = 0; + /* NOTE: to be removed. Trace name will no longer be + * required for LTTng userspace tracer. For now, we set it + * to 'auto' for API compliance. + */ + snprintf(trace->name, 5, "auto"); /* Connect to app using ustctl API */ sock = connect_app(pid); @@ -307,7 +322,7 @@ static int ust_create_trace(pid_t pid) goto error; } - ret = ustctl_create_trace(sock, "auto"); + ret = ustctl_create_trace(sock, trace->name); if (ret < 0) { ret = LTTCOMM_CREATE_FAIL; goto error; @@ -316,6 +331,7 @@ static int ust_create_trace(pid_t pid) /* Check if current session is valid */ if (current_session) { cds_list_add(&trace->list, ¤t_session->ust_traces); + current_session->ust_trace_count++; } error: @@ -358,6 +374,42 @@ error: return ret; } +/* + * ust_stop_trace + * + * Stop a trace. This trace, identified by the pid, must be + * in the current session ust_traces list. + */ +static int ust_stop_trace(pid_t pid) +{ + int sock, ret; + struct ltt_ust_trace *trace; + + DBG("Stopping trace for pid %d", pid); + + trace = find_session_ust_trace_by_pid(current_session, pid); + if (trace == NULL) { + ret = LTTCOMM_NO_TRACE; + goto error; + } + + /* Connect to app using ustctl API */ + sock = connect_app(pid); + if (sock < 0) { + ret = LTTCOMM_NO_TRACEABLE; + goto error; + } + + ret = ustctl_stop_trace(sock, trace->name); + if (ret < 0) { + ret = LTTCOMM_STOP_FAIL; + goto error; + } + +error: + return ret; +} + /* * copy_common_data * @@ -427,6 +479,8 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) char *send_buf = NULL; struct lttcomm_lttng_msg llm; + DBG("Processing client message"); + /* Copy common data to identify the response * on the lttng client side. */ @@ -485,6 +539,25 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* No auxiliary data so only send the llm struct. */ goto end; } + case LTTNG_LIST_TRACES: + { + unsigned int trace_count = get_trace_count_per_session(current_session); + + if (trace_count == 0) { + ret = LTTCOMM_NO_TRACE; + goto end; + } + + buf_size = setup_data_buffer(&send_buf, + sizeof(struct lttng_trace) * trace_count, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto end; + } + + get_traces_per_session(current_session, (struct lttng_trace *)(send_buf + header_size)); + break; + } case UST_CREATE_TRACE: { ret = ust_create_trace(lsm->pid); @@ -527,6 +600,13 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* No auxiliary data so only send the llm struct. */ goto end; } + case UST_STOP_TRACE: + { + ret = ust_stop_trace(lsm->pid); + + /* No auxiliary data so only send the llm struct. */ + goto end; + } case LTTNG_LIST_SESSIONS: { unsigned int session_count = get_session_count(); @@ -771,6 +851,8 @@ static int set_socket_perms(void) perror("chown"); } + DBG("Sockets permissions set"); + end: return ret; } @@ -810,6 +892,8 @@ static int set_signal_handler(void) return ret; } + DBG("Signal handler set for SIGTERM, SIGPIPE and SIGINT"); + return ret; } @@ -822,9 +906,14 @@ static void sighandler(int sig) { switch (sig) { case SIGPIPE: + DBG("SIGPIPE catched"); return; case SIGINT: + DBG("SIGINT catched"); + cleanup(); + break; case SIGTERM: + DBG("SIGTERM catched"); cleanup(); break; default: @@ -841,6 +930,8 @@ static void sighandler(int sig) */ static void cleanup() { + DBG("Cleaning up"); + /* */ MSG("\n%c[%d;%dm*** assert failed *** ==> %c[%dm", 27,1,31,27,0); MSG("%c[%d;%dmMatthew, BEET driven development works!%c[%dm",27,1,33,27,0);