#include "localerr.h"
#include "ustcomm.h"
+//#define USE_CLONE
+
#define UNIX_PATH_MAX 108
#define SOCKETDIR "/tmp/socks"
char payload[94];
};
-pid_t mypid;
char mysocketfile[UNIX_PATH_MAX] = "";
//int pfd = -1;
void start_consumer(void)
{
+#ifdef USE_CLONE
int result;
result = clone(consumer, consumer_stack+sizeof(consumer_stack)-1, CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD, NULL);
if(result == -1) {
perror("clone");
}
+#else
+ pthread_t thread;
+
+ pthread_create(&thread, NULL, consumer, NULL);
+#endif
}
static void print_markers(void)
static int inform_consumer_daemon(void)
{
+ ustcomm_request_consumer(getpid(), "metadata");
+ ustcomm_request_consumer(getpid(), "ust");
}
int listener_main(void *p)
{
int result;
+ DBG("LISTENER");
+
for(;;) {
uint32_t size;
struct sockaddr_un addr;
char trace_type[] = "ustrelay";
char *recvbuf;
int len;
+ struct ustcomm_source src;
- result = ustcomm_app_recv_message(&ustcomm_app, &recvbuf);
+ result = ustcomm_app_recv_message(&ustcomm_app, &recvbuf, &src);
+ DBG("HERE");
if(result) {
WARN("error in ustcomm_app_recv_message");
continue;
DBG("received a message! it's: %s\n", recvbuf);
len = strlen(recvbuf);
- if(len && recvbuf[len-1] == '\n') {
- recvbuf[len-1] = '\0';
- }
+ //if(len && recvbuf[len-1] == '\n') {
+ // recvbuf[len-1] = '\0';
+ //}
if(!strcmp(recvbuf, "print_markers")) {
print_markers();
return;
}
}
+ else if(nth_token_is(recvbuf, "get_shmid", 0) == 1) {
+ struct ltt_trace_struct *trace;
+ char trace_name[] = "auto";
+ int i;
+
+ DBG("get_shmid");
+
+ ltt_lock_traces();
+ trace = _ltt_trace_find(trace_name);
+ ltt_unlock_traces();
+
+ if(trace == NULL) {
+ CPRINTF("cannot find trace!");
+ return 1;
+ }
+
+ for(i=0; i<trace->nr_channels; i++) {
+ struct rchan *rchan = trace->channels[i].trans_channel_data;
+ struct rchan_buf *rbuf = rchan->buf;
+
+ DBG("the shmid is %d", rbuf->shmid);
+
+ }
+ }
+ else if(nth_token_is(recvbuf, "load_probe_lib", 0) == 1) {
+ char *libfile;
+
+ libfile = nth_token(recvbuf, 1);
+
+ DBG("load_probe_lib loading %s", libfile);
+ }
free(recvbuf);
}
}
+static char listener_stack[16384];
+
void create_listener(void)
{
int result;
static char listener_stack[16384];
+ //char *listener_stack = malloc(16384);
+#ifdef USE_CLONE
result = clone(listener_main, listener_stack+sizeof(listener_stack)-1, CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD, NULL);
if(result == -1) {
perror("clone");
}
+#else
+ pthread_t thread;
+
+ pthread_create(&thread, NULL, listener_main, NULL);
+#endif
}
/* The signal handler itself. Signals must be setup so there cannot be
DBG("UST_TRACE constructor");
- mypid = getpid();
+ /* Must create socket before signal handler to prevent races.
+ */
+ result = init_socket();
+ if(result == -1) {
+ ERR("init_socket error");
+ return;
+ }
+ result = init_signal_handler();
+ if(result == -1) {
+ ERR("init_signal_handler error");
+ return;
+ }
if(getenv("UST_TRACE")) {
char trace_name[] = "auto";
ERR("ltt_trace_start failed");
return;
}
- start_consumer();
+ //start_consumer();
+ inform_consumer_daemon();
}
- /* Must create socket before signal handler to prevent races
- * on pfd variable.
- */
- result = init_socket();
- if(result == -1) {
- ERR("init_socket error");
- return;
- }
- result = init_signal_handler();
- if(result == -1) {
- ERR("init_signal_handler error");
- return;
- }
return;