X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=libust%2Ftracectl.c;h=97ab2eb1fb768433c4561733dcfded9b25cee235;hb=26cc701717a287000ac502bbadc451c3a0d76534;hp=b32b501ea9683692bbe7fb82d36b1053790b4c61;hpb=872037bb1437ab961f97834a624eb2d9b0706ab2;p=lttng-ust.git diff --git a/libust/tracectl.c b/libust/tracectl.c index b32b501e..97ab2eb1 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -1,3 +1,20 @@ +/* Copyright (C) 2009 Pierre-Marc Fournier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #define _GNU_SOURCE #include #include @@ -9,11 +26,14 @@ #include #include +#include + #include "marker.h" #include "tracer.h" #include "localerr.h" #include "ustcomm.h" #include "relay.h" /* FIXME: remove */ +#include "marker-control.h" //#define USE_CLONE @@ -88,8 +108,13 @@ void do_command(struct tracecmd *cmd) { } -void receive_commands() +/* This needs to be called whenever a new thread is created. It notifies + * liburcu of the new thread. + */ + +void ust_register_thread(void) { + rcu_register_thread(); } int fd_notif = -1; @@ -146,7 +171,8 @@ void process_blocked_consumers(void) idx++; } - result = poll(fds, n_fds, 0); + while((result = poll(fds, n_fds, 0)) == -1 && errno == EINTR) + /* nothing */; if(result == -1) { PERROR("poll"); return; @@ -205,12 +231,11 @@ void *listener_main(void *p) { int result; + ust_register_thread(); + DBG("LISTENER"); for(;;) { - uint32_t size; - struct sockaddr_un addr; - socklen_t addrlen = sizeof(addr); char trace_name[] = "auto"; char trace_type[] = "ustrelay"; char *recvbuf; @@ -347,7 +372,7 @@ void *listener_main(void *p) ltt_unlock_traces(); if(trace == NULL) { - CPRINTF("cannot find trace!"); + ERR("cannot find trace!"); return (void *)1; } @@ -355,7 +380,6 @@ void *listener_main(void *p) struct rchan *rchan = trace->channels[i].trans_channel_data; struct rchan_buf *rbuf = rchan->buf; struct ltt_channel_struct *ltt_channel = (struct ltt_channel_struct *)rchan->private_data; - struct ltt_channel_buf_struct *ltt_buf = ltt_channel->buf; if(!strcmp(trace->channels[i].channel_name, channel_name)) { char *reply; @@ -395,7 +419,7 @@ void *listener_main(void *p) ltt_unlock_traces(); if(trace == NULL) { - CPRINTF("cannot find trace!"); + ERR("cannot find trace!"); return (void *)1; } @@ -439,7 +463,7 @@ void *listener_main(void *p) ltt_unlock_traces(); if(trace == NULL) { - CPRINTF("cannot find trace!"); + ERR("cannot find trace!"); return (void *)1; } @@ -490,7 +514,7 @@ void *listener_main(void *p) ltt_unlock_traces(); if(trace == NULL) { - CPRINTF("cannot find trace!"); + ERR("cannot find trace!"); return (void *)1; } @@ -500,9 +524,6 @@ void *listener_main(void *p) if(!strcmp(trace->channels[i].channel_name, channel_name)) { struct rchan_buf *rbuf = rchan->buf; struct ltt_channel_buf_struct *lttbuf = trace->channels[i].buf; - char *reply; - long consumed_old=0; - int fd; struct blocked_consumer *bc; bc = (struct blocked_consumer *) malloc(sizeof(struct blocked_consumer)); @@ -556,7 +577,7 @@ void *listener_main(void *p) ltt_unlock_traces(); if(trace == NULL) { - CPRINTF("cannot find trace!"); + ERR("cannot find trace!"); return (void *)1; } @@ -598,7 +619,6 @@ void *listener_main(void *p) char *channel_slash_name = nth_token(recvbuf, 1); char channel_name[256]=""; char marker_name[256]=""; - struct marker_iter iter; result = sscanf(channel_slash_name, "%255[^/]/%255s", channel_name, marker_name); @@ -617,7 +637,6 @@ void *listener_main(void *p) char *channel_slash_name = nth_token(recvbuf, 1); char *marker_name; char *channel_name; - struct marker_iter iter; result = sscanf(channel_slash_name, "%a[^/]/%as", &channel_name, &marker_name); @@ -649,7 +668,7 @@ void *listener_main(void *p) // ltt_unlock_traces(); // // if(trace == NULL) { -// CPRINTF("cannot find trace!"); +// ERR("cannot find trace!"); // return (void *)1; // } // @@ -688,13 +707,11 @@ void *listener_main(void *p) } } -static char listener_stack[16384]; - void create_listener(void) { - int result; +#ifdef USE_CLONE static char listener_stack[16384]; - //char *listener_stack = malloc(16384); +#endif #ifdef USE_CLONE result = clone(listener_main, listener_stack+sizeof(listener_stack)-1, CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD, NULL); @@ -734,18 +751,22 @@ static int init_socket(void) return ustcomm_init_app(getpid(), &ustcomm_app); } +/* FIXME: reenable this to delete socket file. */ + +#if 0 static void destroy_socket(void) { -// int result; -// -// if(mysocketfile[0] == '\0') -// return; -// -// result = unlink(mysocketfile); -// if(result == -1) { -// PERROR("unlink"); -// } + int result; + + if(mysocketfile[0] == '\0') + return; + + result = unlink(mysocketfile); + if(result == -1) { + PERROR("unlink"); + } } +#endif static int init_signal_handler(void) { @@ -783,22 +804,26 @@ static void auto_probe_connect(struct marker *m) int result; result = ltt_marker_connect(m->channel, m->name, "default"); - if(result) - ERR("ltt_marker_connect"); + if(result && result != -EEXIST) + ERR("ltt_marker_connect (marker = %s/%s, errno = %d)", m->channel, m->name, -result); DBG("just auto connected marker %s %s to probe default", m->channel, m->name); } static void __attribute__((constructor(101))) init0() { + /* Initialize RCU in case the constructor order is not good. */ + urcu_init(); + + /* It is important to do this before events start to be generated. */ + ust_register_thread(); + DBG("UST_AUTOPROBE constructor"); if(getenv("UST_AUTOPROBE")) { marker_set_new_marker_cb(auto_probe_connect); } } -static void fini(void); - static void __attribute__((constructor(1000))) init() { int result;