X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracectl.c;h=1b684445e63f1a2efa38bd59f0678f018adb6a9a;hb=b2fb2f91912b59447459eecc4b41baf8154be1bf;hp=7a5cf9562282ce7fe90cc3d5e4c405d3bf44b8c6;hpb=f51d84eac11907346fa02e33da358aad171ac80a;p=ust.git diff --git a/libust/tracectl.c b/libust/tracectl.c index 7a5cf95..1b68444 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -15,6 +15,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* This file contains the implementation of the UST listener thread, which + * receives trace control commands. It also coordinates the initialization of + * libust. + */ + #define _GNU_SOURCE #include #include @@ -49,6 +54,8 @@ */ s64 pidunique = -1LL; +extern struct chan_info_struct chan_infos[]; + struct list_head blocked_consumers = LIST_HEAD_INIT(blocked_consumers); static struct ustcomm_app ustcomm_app; @@ -987,6 +994,25 @@ int process_client_cmd(char *recvbuf, struct ustcomm_source *src) free(reply); } + else if(nth_token_is(recvbuf, "get_sock_path", 0) == 1) { + char *reply = getenv("UST_DAEMON_SOCKET"); + if(!reply) { + asprintf(&reply, "%s/%s", SOCK_DIR, "ustd"); + result = ustcomm_send_reply(&ustcomm_app.server, reply, src); + free(reply); + } + else { + result = ustcomm_send_reply(&ustcomm_app.server, reply, src); + } + if(result) + ERR("ustcomm_send_reply failed"); + } + else if(nth_token_is(recvbuf, "set_sock_path", 0) == 1) { + char *sock_path = nth_token(recvbuf, 1); + result = setenv("UST_DAEMON_SOCKET", sock_path, 1); + if(result) + ERR("cannot set UST_DAEMON_SOCKET environment variable"); + } else { ERR("unable to parse message: %s", recvbuf); } @@ -1063,8 +1089,9 @@ void create_listener(void) if(result) { PERROR("pthread_sigmask: %s", strerror(result)); } - - have_listener = 1; + else { + have_listener = 1; + } } static int init_socket(void) @@ -1114,6 +1141,11 @@ static void __attribute__((constructor)) init() { int result; char* autoprobe_val = NULL; + char* subbuffer_size_val = NULL; + char* subbuffer_count_val = NULL; + unsigned int subbuffer_size; + unsigned int subbuffer_count; + unsigned int power; /* Assign the pidunique, to be able to differentiate the processes with same * pid, (before and after an exec). @@ -1197,6 +1229,23 @@ static void __attribute__((constructor)) init() } } + subbuffer_size_val = getenv("UST_SUBBUF_SIZE"); + if(subbuffer_size_val) { + sscanf(subbuffer_size_val, "%u", &subbuffer_size); + power = pow2_higher_or_eq(subbuffer_size); + if(power != subbuffer_size) + WARN("using the next power of two for buffer size = %u\n", power); + chan_infos[LTT_CHANNEL_UST].def_subbufsize = power; + } + + subbuffer_count_val = getenv("UST_SUBBUF_NUM"); + if(subbuffer_count_val) { + sscanf(subbuffer_count_val, "%u", &subbuffer_count); + if(subbuffer_count < 2) + subbuffer_count = 2; + chan_infos[LTT_CHANNEL_UST].def_subbufcount = subbuffer_count; + } + if(getenv("UST_TRACE")) { char trace_name[] = "auto"; char trace_type[] = "ustrelay"; @@ -1263,7 +1312,6 @@ static void __attribute__((constructor)) init() inform_consumer_daemon(trace_name); } - return; /* should decrementally destroy stuff if error */ @@ -1341,10 +1389,13 @@ int restarting_usleep(useconds_t usecs) return result; } -static void stop_listener() +static void stop_listener(void) { int result; + if(!have_listener) + return; + result = pthread_cancel(listener_thread); if(result != 0) { ERR("pthread_cancel: %s", strerror(result));