#include <ust/tracectl.h>
#include <ust/clock.h>
#include "tracer.h"
-#include "usterr.h"
+#include "usterr_signal_safe.h"
#include "ustcomm.h"
#include "buffers.h"
#include "marker-control.h"
extern struct chan_info_struct chan_infos[];
-static struct cds_list_head open_buffers_list = CDS_LIST_HEAD_INIT(open_buffers_list);
-
static struct cds_list_head ust_socks = CDS_LIST_HEAD_INIT(ust_socks);
/* volatile because shared between the listener and the main thread */
CMM_STORE_SHARED(buffers_to_export, CMM_LOAD_SHARED(buffers_to_export)-1);
}
- /* The buffer has been exported, ergo, we can add it to the
- * list of open buffers
- */
- cds_list_add(&buf->open_buffers_list, &open_buffers_list);
-
unlock_traces:
ltt_unlock_traces();
return retval;
}
-/* Simple commands are those which need only respond with a return value. */
-static int process_simple_client_cmd(int command, char *recv_buf)
-{
- int result;
-
- switch(command) {
- case SET_SOCK_PATH:
- {
- struct ustcomm_single_field *sock_msg;
- sock_msg = (struct ustcomm_single_field *)recv_buf;
- result = ustcomm_unpack_single_field(sock_msg);
- if (result < 0) {
- return result;
- }
- return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1);
- }
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-
static int process_trace_cmd(int command, char *trace_name)
{
int result;
goto send_response;
}
+ case SET_SOCK_PATH:
+ {
+ struct ustcomm_single_field *sock_msg;
+ sock_msg = (struct ustcomm_single_field *)recv_buf;
+ result = ustcomm_unpack_single_field(sock_msg);
+ if (result < 0) {
+ reply_header->result = -EINVAL;
+ goto send_response;
+ }
+
+ reply_header->result = setenv("UST_DAEMON_SOCKET",
+ sock_msg->field, 1);
+
+ goto send_response;
+ }
case START:
case SETUP_TRACE:
case ALLOC_TRACE:
}
default:
- reply_header->result =
- process_simple_client_cmd(recv_header->command,
- recv_buf);
- goto send_response;
+ reply_header->result = -EINVAL;
+ goto send_response;
}
return;
static struct ustcomm_sock * init_app_socket(int epoll_fd)
{
- char *name;
+ char *dir_name, *sock_name;
int result;
- struct ustcomm_sock *sock;
+ struct ustcomm_sock *sock = NULL;
+
+ dir_name = ustcomm_user_sock_dir();
+ if (!dir_name)
+ return NULL;
- result = asprintf(&name, "%s/%d", SOCK_DIR, (int)getpid());
+ result = asprintf(&sock_name, "%s/%d", dir_name, (int)getpid());
if (result < 0) {
ERR("string overflow allocating socket name, "
"UST thread bailing");
- return NULL;
+ goto free_dir_name;
}
- result = ensure_dir_exists(SOCK_DIR);
+ result = ensure_dir_exists(dir_name, S_IRWXU);
if (result == -1) {
ERR("Unable to create socket directory %s, UST thread bailing",
- SOCK_DIR);
- goto free_name;
+ dir_name);
+ goto free_sock_name;
}
- sock = ustcomm_init_named_socket(name, epoll_fd);
+ sock = ustcomm_init_named_socket(sock_name, epoll_fd);
if (!sock) {
ERR("Error initializing named socket (%s). Check that directory"
- "exists and that it is writable. UST thread bailing", name);
- goto free_name;
+ "exists and that it is writable. UST thread bailing", sock_name);
+ goto free_sock_name;
}
- free(name);
- return sock;
+free_sock_name:
+ free(sock_name);
+free_dir_name:
+ free(dir_name);
-free_name:
- free(name);
- return NULL;
+ return sock;
}
static void __attribute__((constructor)) init()
static void ust_fork(void)
{
- struct ust_buffer *buf, *buf_tmp;
struct ustcomm_sock *sock, *sock_tmp;
struct ust_trace *trace, *trace_tmp;
int result;
ustcomm_del_sock(sock, 1);
}
- /* Delete all blocked consumers */
- cds_list_for_each_entry_safe(buf, buf_tmp, &open_buffers_list,
- open_buffers_list) {
- cds_list_del(&buf->open_buffers_list);
- }
-
/*
* FIXME: This could be prettier, we loop over the list twice and
* following good locking practice should lock around the loop