}
break;
}
-#if 0
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
- case LTTNG_DOMAIN_UST_EXEC_NAME:
- case LTTNG_DOMAIN_UST_PID:
-#endif
+ default:
+ ret = LTTNG_ERR_UNKNOWN_DOMAIN;
+ goto error;
+ }
+
+ ret = LTTNG_OK;
+
+error:
+ rcu_read_unlock();
+ return ret;
+}
+
+/*
+ * Command LTTNG_TRACK_PID processed by the client thread.
+ *
+ * Called with session lock held.
+ */
+int cmd_track_pid(struct ltt_session *session, int domain, int pid)
+{
+ int ret;
+
+ rcu_read_lock();
+
+ switch (domain) {
+ case LTTNG_DOMAIN_KERNEL:
+ {
+ struct ltt_kernel_session *ksess;
+
+ ksess = session->kernel_session;
+
+ ret = kernel_track_pid(ksess, pid);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
+ kernel_wait_quiescent(kernel_tracer_fd);
+ break;
+ }
+ case LTTNG_DOMAIN_UST:
+ {
+ struct ltt_ust_session *usess;
+
+ usess = session->ust_session;
+
+ ret = trace_ust_track_pid(usess, pid);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+ break;
+ }
+ default:
+ ret = LTTNG_ERR_UNKNOWN_DOMAIN;
+ goto error;
+ }
+
+ ret = LTTNG_OK;
+
+error:
+ rcu_read_unlock();
+ return ret;
+}
+
+/*
+ * Command LTTNG_UNTRACK_PID processed by the client thread.
+ *
+ * Called with session lock held.
+ */
+int cmd_untrack_pid(struct ltt_session *session, int domain, int pid)
+{
+ int ret;
+
+ rcu_read_lock();
+
+ switch (domain) {
+ case LTTNG_DOMAIN_KERNEL:
+ {
+ struct ltt_kernel_session *ksess;
+
+ ksess = session->kernel_session;
+
+ ret = kernel_untrack_pid(ksess, pid);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
+ kernel_wait_quiescent(kernel_tracer_fd);
+ break;
+ }
+ case LTTNG_DOMAIN_UST:
+ {
+ struct ltt_ust_session *usess;
+
+ usess = session->ust_session;
+
+ ret = trace_ust_untrack_pid(usess, pid);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+ break;
+ }
default:
ret = LTTNG_ERR_UNKNOWN_DOMAIN;
goto error;
break;
}
-#if 0
- case LTTNG_DOMAIN_UST_EXEC_NAME:
- case LTTNG_DOMAIN_UST_PID:
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
-#endif
default:
ret = LTTNG_ERR_UND;
goto error;
}
break;
}
-#if 0
- case LTTNG_DOMAIN_UST_EXEC_NAME:
- case LTTNG_DOMAIN_UST_PID:
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
-#endif
default:
ret = LTTNG_ERR_UND;
goto error;
break;
}
-#if 0
- case LTTNG_DOMAIN_UST_EXEC_NAME:
- case LTTNG_DOMAIN_UST_PID:
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
-#endif
default:
ret = LTTNG_ERR_UND;
goto error;
/*
* Command LTTNG_START_TRACE processed by the client thread.
+ *
+ * Called with session mutex held.
*/
int cmd_start_trace(struct ltt_session *session)
{
/*
* Command LTTNG_DESTROY_SESSION processed by the client thread.
+ *
+ * Called with session lock held.
*/
int cmd_destroy_session(struct ltt_session *session, int wpipe)
{
int ret = LTTNG_OK;
unsigned int use_tmp_output = 0;
struct snapshot_output tmp_output;
- unsigned int nb_streams, snapshot_success = 0;
+ unsigned int snapshot_success = 0;
assert(session);
assert(output);
return ret;
}
+/*
+ * Command LTTNG_SET_SESSION_SHM_PATH processed by the client thread.
+ */
+int cmd_set_session_shm_path(struct ltt_session *session,
+ const char *shm_path)
+{
+ /* Safety net */
+ assert(session);
+
+ /*
+ * Can only set shm path before session is started.
+ */
+ if (session->has_been_started) {
+ return LTTNG_ERR_SESSION_STARTED;
+ }
+
+ strncpy(session->shm_path, shm_path,
+ sizeof(session->shm_path));
+ session->shm_path[sizeof(session->shm_path) - 1] = '\0';
+
+ return 0;
+}
+
/*
* Init command subsystem.
*/