LTTNG_HIDDEN int mi_lttng_pid_tracker_open(struct mi_writer *writer) { int ret; /* Open element pid_tracker */ ret = mi_lttng_writer_open_element(writer, config_element_pid_tracker); if (ret) { goto end; } /* Open targets element */ ret = mi_lttng_targets_open(writer); end: return ret; }
static enum cmd_error_code track_untrack_pid(enum cmd_type cmd_type, const char *cmd_str, const char *session_name, const char *pid_string, int all, struct mi_writer *writer) { int ret, success = 1 , i; enum cmd_error_code retval = CMD_SUCCESS; int *pid_list = NULL; int nr_pids; struct lttng_domain dom; struct lttng_handle *handle = NULL; int (*cmd_func)(struct lttng_handle *handle, int pid); switch (cmd_type) { case CMD_TRACK: cmd_func = lttng_track_pid; break; case CMD_UNTRACK: cmd_func = lttng_untrack_pid; break; default: ERR("Unknown command"); retval = CMD_ERROR; goto end; } memset(&dom, 0, sizeof(dom)); if (opt_kernel) { dom.type = LTTNG_DOMAIN_KERNEL; } else if (opt_userspace) { dom.type = LTTNG_DOMAIN_UST; } else { /* Checked by the caller. */ assert(0); } ret = parse_pid_string(pid_string, all, &pid_list, &nr_pids); if (ret != CMD_SUCCESS) { ERR("Error parsing PID string"); retval = CMD_ERROR; goto end; } handle = lttng_create_handle(session_name, &dom); if (handle == NULL) { retval = CMD_ERROR; goto end; } if (writer) { /* Open process element */ ret = mi_lttng_targets_open(writer); if (ret) { retval = CMD_ERROR; goto end; } } for (i = 0; i < nr_pids; i++) { DBG("%s PID %d", cmd_str, pid_list[i]); ret = cmd_func(handle, pid_list[i]); if (ret) { switch (-ret) { case LTTNG_ERR_PID_TRACKED: WARN("PID %i already tracked in session %s", pid_list[i], session_name); success = 1; retval = CMD_SUCCESS; break; case LTTNG_ERR_PID_NOT_TRACKED: WARN("PID %i not tracked in session %s", pid_list[i], session_name); success = 1; retval = CMD_SUCCESS; break; default: ERR("%s", lttng_strerror(ret)); success = 0; retval = CMD_ERROR; break; } } else { MSG("PID %i %sed in session %s", pid_list[i], cmd_str, session_name); success = 1; } /* Mi */ if (writer) { ret = mi_lttng_pid_target(writer, pid_list[i], 1); if (ret) { retval = CMD_ERROR; goto end; } ret = mi_lttng_writer_write_element_bool(writer, mi_lttng_element_success, success); if (ret) { retval = CMD_ERROR; goto end; } ret = mi_lttng_writer_close_element(writer); if (ret) { retval = CMD_ERROR; goto end; } } } if (writer) { /* Close targets element */ ret = mi_lttng_writer_close_element(writer); if (ret) { retval = CMD_ERROR; goto end; } } end: if (handle) { lttng_destroy_handle(handle); } free(pid_list); return retval; }