#include "ust-ctl.h"
#include "session.h"
#include "traceable-app.h"
+#include "lttng-kconsumerd.h"
/*
* TODO:
/* Const values */
const char default_home_dir[] = DEFAULT_HOME_DIR;
-const char default_tracing_group[] = DEFAULT_TRACING_GROUP;
+const char default_tracing_group[] = LTTNG_DEFAULT_TRACING_GROUP;
const char default_ust_sock_dir[] = DEFAULT_UST_SOCK_DIR;
const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE;
static pthread_mutex_t kconsumerd_pid_mutex; /* Mutex to control kconsumerd pid assignation */
-/*
- * free_kernel_session
- *
- * Free all data structure inside a kernel session and the session pointer.
- */
-static void free_kernel_session(struct ltt_kernel_session *session)
-{
- struct ltt_kernel_channel *chan;
- struct ltt_kernel_stream *stream;
- struct ltt_kernel_event *event;
-
- /* Clean metadata */
- close(session->metadata_stream_fd);
- close(session->metadata->fd);
- free(session->metadata->conf);
- free(session->metadata);
-
- cds_list_for_each_entry(chan, &session->channel_list.head, list) {
- /* Clean all event(s) */
- cds_list_for_each_entry(event, &chan->events_list.head, list) {
- close(event->fd);
- free(event->event);
- free(event);
- }
-
- /* Clean streams */
- cds_list_for_each_entry(stream, &chan->stream_list.head, list) {
- close(stream->fd);
- free(stream->pathname);
- free(stream);
- }
- /* Clean channel */
- close(chan->fd);
- free(chan->channel);
- free(chan->pathname);
- free(chan);
- }
-
- close(session->fd);
- free(session);
-
- DBG("All kernel session data structures freed");
-}
-
/*
* teardown_kernel_session
*
{
if (session->kernel_session != NULL) {
DBG("Tearing down kernel session");
- free_kernel_session(session->kernel_session);
+ trace_destroy_kernel_session(session->kernel_session);
/* Extra precaution */
session->kernel_session = NULL;
/* Decrement session count */
goto error;
}
+ /* Getting status code from kconsumerd */
ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
if (ret <= 0) {
goto error;
if (code == KCONSUMERD_COMMAND_SOCK_READY) {
kconsumerd_cmd_sock = lttcomm_connect_unix_sock(kconsumerd_cmd_unix_sock_path);
if (kconsumerd_cmd_sock < 0) {
+ sem_post(&kconsumerd_sem);
perror("kconsumerd connect");
goto error;
}
goto error;
}
- while (1) {
- /* Wait for any kconsumerd error */
- ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
- if (ret <= 0) {
- ERR("Kconsumerd closed the command socket");
- goto error;
- }
-
- ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
- if (code != KCONSUMERD_POLL_HUP) {
- goto error;
- }
+ /* Wait for any kconsumerd error */
+ ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
+ if (ret <= 0) {
+ ERR("Kconsumerd closed the command socket");
+ goto error;
}
+ ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
+
error:
kconsumerd_pid = 0;
DBG("Kconsumerd thread dying");
/* Wait for the kconsumerd thread to be ready */
sem_wait(&kconsumerd_sem);
+ if (kconsumerd_pid == 0) {
+ ERR("Kconsumerd did not start");
+ goto error;
+ }
+
return 0;
error:
+ ret = LTTCOMM_KERN_CONSUMER_FAIL;
return ret;
}
DBG("Kconsumerd pid %d", ret);
DBG("Spawning kconsumerd thread");
-
ret = spawn_kconsumerd_thread();
if (ret < 0) {
ERR("Fatal error spawning kconsumerd thread");
- ret = LTTCOMM_FATAL;
goto error;
}
/* Setup header */
lkh.payload_size = nb_fd * sizeof(struct lttcomm_kconsumerd_msg);
- lkh.cmd_type = LTTCOMM_ADD_STREAM;
+ lkh.cmd_type = ADD_STREAM;
DBG("Sending kconsumerd header");