X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=39dfbc41d9254e27dd3a3ea4262e78608ce82126;hb=e6ddca715d6dedb6ee25fe4392a6e1f9626b2544;hp=75a793164d4f70843bb176ce9897522f7f811b02;hpb=a88df331a1ef01cb387fe09dfa830c2fa3501fbc;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 75a793164..39dfbc41d 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -49,7 +49,6 @@ #include "session.h" #include "traceable-app.h" #include "lttng-kconsumerd.h" -#include "libustctl.h" #include "utils.h" /* @@ -226,18 +225,18 @@ static int send_unix_sock(int sock, void *buf, size_t len) * * Free memory of a command context structure. */ -static void clean_command_ctx(struct command_ctx *cmd_ctx) +static void clean_command_ctx(struct command_ctx **cmd_ctx) { - DBG("Clean command context structure %p", cmd_ctx); - if (cmd_ctx) { - if (cmd_ctx->llm) { - free(cmd_ctx->llm); + DBG("Clean command context structure"); + if (*cmd_ctx) { + if ((*cmd_ctx)->llm) { + free((*cmd_ctx)->llm); } - if (cmd_ctx->lsm) { - free(cmd_ctx->lsm); + if ((*cmd_ctx)->lsm) { + free((*cmd_ctx)->lsm); } - free(cmd_ctx); - cmd_ctx = NULL; + free(*cmd_ctx); + *cmd_ctx = NULL; } } @@ -350,6 +349,7 @@ error: return ret; } +#ifdef DISABLED /* * ust_connect_app * @@ -380,6 +380,7 @@ static int ust_connect_app(pid_t pid) return sock; } +#endif /* DISABLED */ /* * notify_apps @@ -468,7 +469,7 @@ static int update_kernel_pollfd(void) DBG("Updating kernel_pollfd"); /* Get the number of channel of all kernel session */ - pthread_mutex_lock(&session_list_ptr->lock); + lock_session_list(); cds_list_for_each_entry(session, &session_list_ptr->head, list) { lock_session(session); if (session->kernel_session == NULL) { @@ -505,7 +506,7 @@ static int update_kernel_pollfd(void) } unlock_session(session); } - pthread_mutex_unlock(&session_list_ptr->lock); + unlock_session_list(); /* Adding wake up pipe */ kernel_pollfd[nb_fd - 2].fd = kernel_poll_pipe[0]; @@ -517,7 +518,7 @@ static int update_kernel_pollfd(void) return nb_fd; error: - pthread_mutex_unlock(&session_list_ptr->lock); + unlock_session_list(); return -1; } @@ -537,7 +538,7 @@ static int update_kernel_stream(int fd) DBG("Updating kernel streams for channel fd %d", fd); - pthread_mutex_lock(&session_list_ptr->lock); + lock_session_list(); cds_list_for_each_entry(session, &session_list_ptr->head, list) { lock_session(session); if (session->kernel_session == NULL) { @@ -568,10 +569,10 @@ static int update_kernel_stream(int fd) } end: + unlock_session_list(); if (session) { unlock_session(session); } - pthread_mutex_unlock(&session_list_ptr->lock); return ret; } @@ -1227,6 +1228,30 @@ error: return ret; } +/* + * Using the session list, filled a lttng_session array to send back to the + * client for session listing. + * + * The session list lock MUST be acquired before calling this function. Use + * lock_session_list() and unlock_session_list(). + */ +static void list_lttng_sessions(struct lttng_session *sessions) +{ + int i = 0; + struct ltt_session *session; + + DBG("Getting all available session"); + /* + * Iterate over session list and append data after the control struct in + * the buffer. + */ + cds_list_for_each_entry(session, &session_list_ptr->head, list) { + strncpy(sessions[i].path, session->path, PATH_MAX); + strncpy(sessions[i].name, session->name, NAME_MAX); + i++; + } +} + /* * process_client_msg * @@ -1310,6 +1335,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } } +#ifdef DISABLED /* Connect to ust apps if available pid */ if (cmd_ctx->lsm->pid > 0) { /* Connect to app using ustctl API */ @@ -1319,6 +1345,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto error; } } +#endif /* DISABLED */ /* Process by command type */ switch (cmd_ctx->lsm->cmd_type) { @@ -1636,7 +1663,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) if (ev == NULL) { strncpy(ev_attr.name, event, LTTNG_SYM_NAME_LEN); /* Default event type for enable all */ - ev_attr.type = LTTNG_EVENT_TRACEPOINTS; + ev_attr.type = LTTNG_EVENT_TRACEPOINT; /* Enable each single tracepoint event */ ret = kernel_create_event(&ev_attr, chan); if (ret < 0) { @@ -1938,20 +1965,23 @@ static int process_client_msg(struct command_ctx *cmd_ctx) */ case LTTNG_LIST_SESSIONS: { - unsigned int session_count; + lock_session_list(); - session_count = get_session_count(); - if (session_count == 0) { + if (session_list_ptr->count == 0) { ret = LTTCOMM_NO_SESSION; goto error; } - ret = setup_lttng_msg(cmd_ctx, sizeof(struct lttng_session) * session_count); + ret = setup_lttng_msg(cmd_ctx, sizeof(struct lttng_session) * + session_list_ptr->count); if (ret < 0) { goto setup_error; } - get_lttng_session((struct lttng_session *)(cmd_ctx->llm->payload)); + /* Filled the session array */ + list_lttng_sessions((struct lttng_session *)(cmd_ctx->llm->payload)); + + unlock_session_list(); ret = LTTCOMM_OK; break; @@ -2081,7 +2111,7 @@ static void *thread_manage_clients(void *data) /* TODO: Inform client somehow of the fatal error. At this point, * ret < 0 means that a malloc failed (ENOMEM). */ /* Error detected but still accept command */ - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); continue; } @@ -2092,7 +2122,7 @@ static void *thread_manage_clients(void *data) ERR("Failed to send data back to client"); } - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); /* End of transmission */ close(sock); @@ -2109,7 +2139,7 @@ error: unlink(client_unix_sock_path); - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); return NULL; }