+#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <signal.h>
struct list_head list;
};
-static void print_markers(void)
+static void print_markers(FILE *fp)
{
struct marker_iter iter;
marker_iter_start(&iter);
while(iter.marker) {
- fprintf(stderr, "marker: %s_%s \"%s\"\n", iter.marker->channel, iter.marker->name, iter.marker->format);
+ fprintf(fp, "marker: %s_%s %d \"%s\"\n", iter.marker->channel, iter.marker->name, (int)imv_read(iter.marker->state), iter.marker->format);
marker_iter_next(&iter);
}
unlock_markers();
}
}
-static int inform_consumer_daemon(void)
+static void inform_consumer_daemon(void)
{
ustcomm_request_consumer(getpid(), "metadata");
ustcomm_request_consumer(getpid(), "ust");
result = poll(fds, n_fds, 0);
if(result == -1) {
PERROR("poll");
- return -1;
+ return;
}
list_for_each_entry(bc, &blocked_consumers, list) {
close(bc->fd_producer);
- __list_del(bc->list.prev, bc->list.next);
+ list_del(&bc->list);
result = ustcomm_send_reply(&bc->server, "END", &bc->src);
if(result < 0) {
}
free(reply);
- __list_del(bc->list.prev, bc->list.next);
+ list_del(&bc->list);
}
}
}
-int listener_main(void *p)
+void *listener_main(void *p)
{
int result;
len = strlen(recvbuf);
if(!strcmp(recvbuf, "print_markers")) {
- print_markers();
+ print_markers(stderr);
+ }
+ else if(!strcmp(recvbuf, "list_markers")) {
+ char *ptr;
+ size_t size;
+ FILE *fp;
+
+ fp = open_memstream(&ptr, &size);
+ print_markers(fp);
+ fclose(fp);
+
+ result = ustcomm_send_reply(&ustcomm_app.server, ptr, &src);
+
+ free(ptr);
+ }
+ else if(!strcmp(recvbuf, "start")) {
+ /* start is an operation that setups the trace, allocates it and starts it */
+ result = ltt_trace_setup(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_setup failed");
+ return (void *)1;
+ }
+
+ result = ltt_trace_set_type(trace_name, trace_type);
+ if(result < 0) {
+ ERR("ltt_trace_set_type failed");
+ return (void *)1;
+ }
+
+ result = ltt_trace_alloc(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_alloc failed");
+ return (void *)1;
+ }
+
+ inform_consumer_daemon();
+
+ result = ltt_trace_start(trace_name);
+ if(result < 0) {
+ ERR("ltt_trace_start failed");
+ continue;
+ }
}
else if(!strcmp(recvbuf, "trace_setup")) {
DBG("trace setup");
result = ltt_trace_setup(trace_name);
if(result < 0) {
ERR("ltt_trace_setup failed");
- return;
+ return (void *)1;
}
result = ltt_trace_set_type(trace_name, trace_type);
if(result < 0) {
ERR("ltt_trace_set_type failed");
- return;
+ return (void *)1;
}
}
else if(!strcmp(recvbuf, "trace_alloc")) {
result = ltt_trace_alloc(trace_name);
if(result < 0) {
ERR("ltt_trace_alloc failed");
- return;
+ return (void *)1;
}
}
else if(!strcmp(recvbuf, "trace_start")) {
result = ltt_trace_stop(trace_name);
if(result < 0) {
ERR("ltt_trace_stop failed");
- return;
+ return (void *)1;
}
}
else if(!strcmp(recvbuf, "trace_destroy")) {
result = ltt_trace_destroy(trace_name);
if(result < 0) {
ERR("ltt_trace_destroy failed");
- return;
+ return (void *)1;
}
}
else if(nth_token_is(recvbuf, "get_shmid", 0) == 1) {
ltt_unlock_traces();
if(trace == NULL) {
- CPRINTF("cannot find trace!");
- return 1;
+ ERR("cannot find trace!");
+ return (void *)1;
}
for(i=0; i<trace->nr_channels; i++) {
ltt_unlock_traces();
if(trace == NULL) {
- CPRINTF("cannot find trace!");
- return 1;
+ ERR("cannot find trace!");
+ return (void *)1;
}
for(i=0; i<trace->nr_channels; i++) {
if(!strcmp(trace->channels[i].channel_name, channel_name)) {
char *reply;
- DBG("the n_subbufs for the requested channel is %d", rchan->n_subbufs);
- asprintf(&reply, "%d", rchan->n_subbufs);
+ DBG("the n_subbufs for the requested channel is %zd", rchan->n_subbufs);
+ asprintf(&reply, "%zd", rchan->n_subbufs);
result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
if(result) {
ltt_unlock_traces();
if(trace == NULL) {
- CPRINTF("cannot find trace!");
- return 1;
+ ERR("cannot find trace!");
+ return (void *)1;
}
for(i=0; i<trace->nr_channels; i++) {
if(!strcmp(trace->channels[i].channel_name, channel_name)) {
char *reply;
- DBG("the subbuf_size for the requested channel is %d", rchan->subbuf_size);
- asprintf(&reply, "%d", rchan->subbuf_size);
+ DBG("the subbuf_size for the requested channel is %zd", rchan->subbuf_size);
+ asprintf(&reply, "%zd", rchan->subbuf_size);
result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
if(result) {
ltt_unlock_traces();
if(trace == NULL) {
- CPRINTF("cannot find trace!");
- return 1;
+ ERR("cannot find trace!");
+ return (void *)1;
}
for(i=0; i<trace->nr_channels; i++) {
ltt_unlock_traces();
if(trace == NULL) {
- CPRINTF("cannot find trace!");
- return 1;
+ ERR("cannot find trace!");
+ return (void *)1;
}
for(i=0; i<trace->nr_channels; i++) {
result = ltt_do_put_subbuf(rbuf, lttbuf, consumed_old);
if(result < 0) {
- WARN("ltt_do_put_subbuf: error");
+ WARN("ltt_do_put_subbuf: error (subbuf=%s)", channel_name);
+ asprintf(&reply, "%s", "ERROR");
}
else {
- DBG("ltt_do_put_subbuf: success");
+ DBG("ltt_do_put_subbuf: success (subbuf=%s)", channel_name);
+ asprintf(&reply, "%s", "OK");
}
- asprintf(&reply, "%s", "OK", consumed_old);
result = ustcomm_send_reply(&ustcomm_app.server, reply, &src);
if(result) {
free(channel_name);
free(consumed_old_str);
}
+ else if(nth_token_is(recvbuf, "enable_marker", 0) == 1) {
+ 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);
+
+ if(channel_name == NULL || marker_name == NULL) {
+ WARN("invalid marker name");
+ goto next_cmd;
+ }
+ printf("%s %s\n", channel_name, marker_name);
+
+ result = ltt_marker_connect(channel_name, marker_name, "default");
+ if(result < 0) {
+ WARN("could not enable marker; channel=%s, name=%s", channel_name, marker_name);
+ }
+ }
+ else if(nth_token_is(recvbuf, "disable_marker", 0) == 1) {
+ 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);
+
+ if(marker_name == NULL) {
+ }
+ printf("%s %s\n", channel_name, marker_name);
+
+ result = ltt_marker_disconnect(channel_name, marker_name, "default");
+ if(result < 0) {
+ WARN("could not disable marker; channel=%s, name=%s", channel_name, marker_name);
+ }
+ }
// else if(nth_token_is(recvbuf, "get_notifications", 0) == 1) {
// struct ltt_trace_struct *trace;
// char trace_name[] = "auto";
// ltt_unlock_traces();
//
// if(trace == NULL) {
-// CPRINTF("cannot find trace!");
-// return 1;
+// ERR("cannot find trace!");
+// return (void *)1;
// }
//
// for(i=0; i<trace->nr_channels; i++) {
ERR("ltt_trace_start failed");
return;
}
- //start_consumer();
inform_consumer_daemon();
}
/* This is only called if we terminate normally, not with an unhandled signal,
* so we cannot rely on it. */
+/* This destructor probably isn't needed, because ustd can do crash recovery. */
+#if 0
static void __attribute__((destructor)) fini()
{
int result;
ERR("ltt_trace_destroy error");
}
- /* FIXME: wait for the consumer to be done */
- //DBG("waiting 5 sec for consume");
- //sleep(5);
-
destroy_socket();
}
+#endif