LTTNG_ERR_TRIGGER_EXISTS = 126, /* Trigger already registered. */
LTTNG_ERR_TRIGGER_NOT_FOUND = 127, /* Trigger not found. */
LTTNG_ERR_COMMAND_CANCELLED = 128, /* Command cancelled. */
+ LTTNG_ERR_AGENT_TRACING_DISABLED = 139, /* Agent tracing disabled. */
/* MUST be last element */
LTTNG_ERR_NR, /* Last element */
#include "session.h"
#include "utils.h"
+static int agent_tracing_enabled = -1;
+
/*
* Note that there is not port here. It's set after this URI is parsed so we
* can let the user define a custom one. However, localhost is ALWAYS the
return ret;
}
+bool agent_tracing_is_enabled(void)
+{
+ int enabled;
+
+ enabled = uatomic_read(&agent_tracing_enabled);
+ assert(enabled != -1);
+ return enabled == 1;
+}
+
/*
* This thread manage application notify communication.
*/
}
reg_sock = init_tcp_socket();
+ uatomic_set(&agent_tracing_enabled, !!reg_sock);
+
+ /*
+ * Signal that the agent thread is ready. The command thread
+ * may start to query whether or not agent tracing is enabled.
+ */
sessiond_notify_ready();
if (!reg_sock) {
goto error_tcp_socket;
}
exit:
+ uatomic_set(&agent_tracing_enabled, 0);
/* Whatever happens, try to delete it and exit. */
(void) lttng_poll_del(&events, reg_sock->fd);
error:
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <stdbool.h>
+
#ifndef LTTNG_SESSIOND_AGENT_THREAD_H
#define LTTNG_SESSIOND_AGENT_THREAD_H
#ifdef HAVE_LIBLTTNG_UST_CTL
void *agent_thread_manage_registration(void *data);
+bool agent_tracing_is_enabled(void);
#else /* HAVE_LIBLTTNG_UST_CTL */
{
return NULL;
}
+static inline
+bool agent_tracing_is_enabled(void)
+{
+ return false;
+}
#endif /* HAVE_LIBLTTNG_UST_CTL */
#include "buffer-registry.h"
#include "notification-thread.h"
#include "notification-thread-commands.h"
+#include "agent-thread.h"
#include "cmd.h"
break;
}
case LTTNG_DOMAIN_UST:
+ break;
case LTTNG_DOMAIN_JUL:
case LTTNG_DOMAIN_LOG4J:
case LTTNG_DOMAIN_PYTHON:
+ if (!agent_tracing_is_enabled()) {
+ DBG("Attempted to enable a channel in an agent domain but the agent thread is not running");
+ ret = LTTNG_ERR_AGENT_TRACING_DISABLED;
+ goto error;
+ }
break;
default:
ret = LTTNG_ERR_UNKNOWN_DOMAIN;
assert(usess);
+ if (!agent_tracing_is_enabled()) {
+ DBG("Attempted to enable an event in an agent domain but the agent thread is not running");
+ ret = LTTNG_ERR_AGENT_TRACING_DISABLED;
+ goto error;
+ }
+
agt = trace_ust_find_agent(usess, domain->type);
if (!agt) {
agt = agent_create(domain->type);
}
sessiond_notify_ready();
+
ret = sem_post(&load_info->message_thread_ready);
if (ret) {
PERROR("sem_post message_thread_ready");
goto error;
}
+ /*
+ * Wait until all support threads are initialized before accepting
+ * commands.
+ */
+ while (uatomic_read(<tng_sessiond_ready) != 0) {
+ fd_set read_fds;
+ struct timeval timeout;
+
+ FD_ZERO(&read_fds);
+ FD_SET(thread_quit_pipe[0], &read_fds);
+ memset(&timeout, 0, sizeof(timeout));
+ timeout.tv_usec = 1000;
+
+ /*
+ * If a support thread failed to launch, it may signal that
+ * we must exit and the sessiond would never be marked as
+ * "ready".
+ *
+ * The timeout is set to 1ms, which serves as a way to
+ * pace down this check.
+ */
+ ret = select(thread_quit_pipe[0] + 1, &read_fds, NULL, NULL,
+ &timeout);
+ if (ret > 0 || (ret < 0 && errno != EINTR)) {
+ goto exit;
+ }
+ }
+
/* This testpoint is after we signal readiness to the parent. */
if (testpoint(sessiond_thread_manage_clients)) {
goto error;
[ ERROR_INDEX(LTTNG_ERR_TRIGGER_EXISTS) ] = "Trigger already registered",
[ ERROR_INDEX(LTTNG_ERR_TRIGGER_NOT_FOUND) ] = "Trigger not found",
[ ERROR_INDEX(LTTNG_ERR_COMMAND_CANCELLED) ] = "Command cancelled",
+ [ ERROR_INDEX(LTTNG_ERR_AGENT_TRACING_DISABLED) ] = "Session daemon agent tracing is disabled",
/* Last element */
[ ERROR_INDEX(LTTNG_ERR_NR) ] = "Unknown error code"