Implement PID tracker content listing
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index e68aa79d4c053ecd5aa598a7f10d7cee4ac383e4..b2a8f555c5fc072b39e1e922a5eef84a2b1b8f43 100644 (file)
@@ -994,10 +994,30 @@ static void update_ust_app(int app_sock)
 
        /* For all tracing session(s) */
        cds_list_for_each_entry_safe(sess, stmp, &session_list_ptr->head, list) {
+               struct ust_app *app;
+
                session_lock(sess);
-               if (sess->ust_session) {
-                       ust_app_global_update(sess->ust_session, app_sock);
+               if (!sess->ust_session) {
+                       goto unlock_session;
                }
+
+               rcu_read_lock();
+               assert(app_sock >= 0);
+               app = ust_app_find_by_sock(app_sock);
+               if (app == NULL) {
+                       /*
+                        * Application can be unregistered before so
+                        * this is possible hence simply stopping the
+                        * update.
+                        */
+                       DBG3("UST app update failed to find app sock %d",
+                               app_sock);
+                       goto unlock_rcu;
+               }
+               ust_app_global_update(sess->ust_session, app);
+       unlock_rcu:
+               rcu_read_unlock();
+       unlock_session:
                session_unlock(sess);
        }
 }
@@ -2765,7 +2785,16 @@ static int create_ust_session(struct ltt_session *session,
        lus->snapshot_mode = session->snapshot_mode;
        lus->live_timer_interval = session->live_timer;
        session->ust_session = lus;
-
+       if (session->shm_path[0]) {
+               strncpy(lus->root_shm_path, session->shm_path,
+                       sizeof(lus->root_shm_path));
+               lus->root_shm_path[sizeof(lus->root_shm_path) - 1] = '\0';
+               strncpy(lus->shm_path, session->shm_path,
+                       sizeof(lus->shm_path));
+               lus->shm_path[sizeof(lus->shm_path) - 1] = '\0';
+               strncat(lus->shm_path, "/ust",
+                       sizeof(lus->shm_path) - strlen(lus->shm_path) - 1);
+       }
        /* Copy session output to the newly created UST session */
        ret = copy_session_consumer(domain->type, session);
        if (ret != LTTNG_OK) {
@@ -2890,6 +2919,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
        case LTTNG_SNAPSHOT_LIST_OUTPUT:
        case LTTNG_SNAPSHOT_RECORD:
        case LTTNG_SAVE_SESSION:
+       case LTTNG_SET_SESSION_SHM_PATH:
                need_domain = 0;
                break;
        default:
@@ -2930,6 +2960,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
        case LTTNG_LIST_CHANNELS:
        case LTTNG_LIST_EVENTS:
        case LTTNG_LIST_SYSCALLS:
+       case LTTNG_LIST_TRACKER_PIDS:
                break;
        default:
                /* Setup lttng message with no payload */
@@ -3242,6 +3273,20 @@ skip_domain:
                                &cmd_ctx->lsm->u.channel.chan, kernel_poll_pipe[1]);
                break;
        }
+       case LTTNG_TRACK_PID:
+       {
+               ret = cmd_track_pid(cmd_ctx->session,
+                               cmd_ctx->lsm->domain.type,
+                               cmd_ctx->lsm->u.pid_tracker.pid);
+               break;
+       }
+       case LTTNG_UNTRACK_PID:
+       {
+               ret = cmd_untrack_pid(cmd_ctx->session,
+                               cmd_ctx->lsm->domain.type,
+                               cmd_ctx->lsm->u.pid_tracker.pid);
+               break;
+       }
        case LTTNG_ENABLE_EVENT:
        {
                struct lttng_event_exclusion *exclusion = NULL;
@@ -3451,6 +3496,38 @@ skip_domain:
                ret = LTTNG_OK;
                break;
        }
+       case LTTNG_LIST_TRACKER_PIDS:
+       {
+               int32_t *pids = NULL;
+               ssize_t nr_pids;
+
+               nr_pids = cmd_list_tracker_pids(cmd_ctx->session,
+                               cmd_ctx->lsm->domain.type, &pids);
+               if (nr_pids < 0) {
+                       /* Return value is a negative lttng_error_code. */
+                       ret = -nr_pids;
+                       goto error;
+               }
+
+               /*
+                * Setup lttng message with payload size set to the event list size in
+                * bytes and then copy list into the llm payload.
+                */
+               ret = setup_lttng_msg(cmd_ctx, sizeof(int32_t) * nr_pids);
+               if (ret < 0) {
+                       free(pids);
+                       goto setup_error;
+               }
+
+               /* Copy event list into message payload */
+               memcpy(cmd_ctx->llm->payload, pids,
+                               sizeof(int) * nr_pids);
+
+               free(pids);
+
+               ret = LTTNG_OK;
+               break;
+       }
        case LTTNG_SET_CONSUMER_URI:
        {
                size_t nb_uri, len;
@@ -3830,6 +3907,12 @@ skip_domain:
                        &cmd_ctx->creds);
                break;
        }
+       case LTTNG_SET_SESSION_SHM_PATH:
+       {
+               ret = cmd_set_session_shm_path(cmd_ctx->session,
+                               cmd_ctx->lsm->u.set_shm_path.shm_path);
+               break;
+       }
        default:
                ret = LTTNG_ERR_UND;
                break;
@@ -4596,6 +4679,10 @@ static int set_option(int opt, const char *arg, const char *optname)
                } else {
                        unsigned long v;
 
+                       if (!arg) {
+                               ret = -EINVAL;
+                               goto end;
+                       }
                        errno = 0;
                        v = strtoul(arg, NULL, 0);
                        if (errno != 0 || !isdigit(arg[0])) {
This page took 0.025499 seconds and 4 git commands to generate.