ust: collect many channels and start work on pipe listener
[ust.git] / hello / hello.c
index 2e74505ce08e74290f0fa670057631a7268b48f2..d6750d061d349dee41628d3c671aef6d6389708f 100644 (file)
@@ -34,15 +34,19 @@ int safe_printf(const char *fmt, ...)
        va_end(ap);
 }
 
+struct consumer_channel {
+       int fd;
+       struct ltt_channel_struct *chan;
+};
+
 int consumer(void *arg)
 {
        int result;
-
        int fd;
-
        char str[] = "Hello, this is the consumer.\n";
-
        struct ltt_trace_struct *trace;
+       struct consumer_channel *consumer_channels;
+       int i;
 
        ltt_lock_traces();
        trace = _ltt_trace_find(trace_name);
@@ -53,43 +57,91 @@ int consumer(void *arg)
                return 1;
        }
 
-       CPRINTF("consumer: got a trace: %s with %d channels\n", trace_name, trace->nr_channels);
-
-       struct ltt_channel_struct *chan = &trace->channels[0];
+       consumer_channels = (struct consumer_channel *) malloc(trace->nr_channels * sizeof(struct consumer_channel));
+       if(consumer_channels == NULL) {
+               ERR("malloc returned NULL");
+               return 1;
+       }
 
-       CPRINTF("channel 1 (%s) active=%u", chan->channel_name, chan->active & 1);
+       CPRINTF("opening trace files");
+       for(i=0; i<trace->nr_channels; i++) {
+               char tmp[100];
+               struct ltt_channel_struct *chan = &trace->channels[i];
 
-       struct rchan *rchan = chan->trans_channel_data;
-       struct rchan_buf *rbuf = rchan->buf;
-       struct ltt_channel_buf_struct *lttbuf = chan->buf;
-       long consumed_old;
+               consumer_channels[i].chan = chan;
 
-       result = fd = open("trace.out", O_WRONLY | O_CREAT | O_TRUNC, 00644);
-       if(result == -1) {
-               perror("open");
-               return -1;
+               snprintf(tmp, sizeof(tmp), "trace/%s", chan->channel_name);
+               result = consumer_channels[i].fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC, 00644);
+               if(result == -1) {
+                       perror("open");
+                       return -1;
+               }
+               CPRINTF("\topened trace file %s", tmp);
+               
        }
+       CPRINTF("done opening trace files");
 
        for(;;) {
-               write(STDOUT_FILENO, str, sizeof(str));
-
-               result = ltt_do_get_subbuf(rbuf, lttbuf, &consumed_old);
-               if(result < 0) {
-                       CPRINTF("ltt_do_get_subbuf: error: %s", strerror(-result));
+               /*wait*/
+
+               for(i=0; i<trace->nr_channels; i++) {
+                       struct rchan *rchan = consumer_channels[i].chan->trans_channel_data;
+                       struct rchan_buf *rbuf = rchan->buf;
+                       struct ltt_channel_buf_struct *lttbuf = consumer_channels[i].chan->buf;
+                       long consumed_old;
+
+                       result = ltt_do_get_subbuf(rbuf, lttbuf, &consumed_old);
+                       if(result < 0) {
+                               CPRINTF("ltt_do_get_subbuf: error: %s", strerror(-result));
+                       }
+                       else {
+                               CPRINTF("success!");
+
+                               result = write(consumer_channels[i].fd, rbuf->buf_data + (consumed_old & (2 * 4096-1)), 4096);
+                               ltt_do_put_subbuf(rbuf, lttbuf, consumed_old);
+                       }
                }
-               else {
-                       CPRINTF("success!");
-
-                       result = write(fd, rbuf->buf_data + (consumed_old & (2 * 4096-1)), 4096);
-                       ltt_do_put_subbuf(rbuf, lttbuf, consumed_old);
-               }
-
-               //CPRINTF("There seems to be %ld bytes available", SUBBUF_TRUNC(local_read(&lttbuf->offset), rbuf->chan) - consumed_old);
-               CPRINTF("Commit count %ld", local_read(&lttbuf->commit_count[0]));
-
 
                sleep(1);
        }
+
+//     CPRINTF("consumer: got a trace: %s with %d channels\n", trace_name, trace->nr_channels);
+//
+//     struct ltt_channel_struct *chan = &trace->channels[0];
+//
+//     CPRINTF("channel 1 (%s) active=%u", chan->channel_name, chan->active & 1);
+
+//     struct rchan *rchan = chan->trans_channel_data;
+//     struct rchan_buf *rbuf = rchan->buf;
+//     struct ltt_channel_buf_struct *lttbuf = chan->buf;
+//     long consumed_old;
+//
+//     result = fd = open("trace.out", O_WRONLY | O_CREAT | O_TRUNC, 00644);
+//     if(result == -1) {
+//             perror("open");
+//             return -1;
+//     }
+
+//     for(;;) {
+//             write(STDOUT_FILENO, str, sizeof(str));
+//
+//             result = ltt_do_get_subbuf(rbuf, lttbuf, &consumed_old);
+//             if(result < 0) {
+//                     CPRINTF("ltt_do_get_subbuf: error: %s", strerror(-result));
+//             }
+//             else {
+//                     CPRINTF("success!");
+//
+//                     result = write(fd, rbuf->buf_data + (consumed_old & (2 * 4096-1)), 4096);
+//                     ltt_do_put_subbuf(rbuf, lttbuf, consumed_old);
+//             }
+//
+//             //CPRINTF("There seems to be %ld bytes available", SUBBUF_TRUNC(local_read(&lttbuf->offset), rbuf->chan) - consumed_old);
+//             CPRINTF("Commit count %ld", local_read(&lttbuf->commit_count[0]));
+//
+//
+//             sleep(1);
+//     }
 }
 
 void start_consumer(void)
@@ -144,6 +196,7 @@ int init_int_handler(void)
 int main()
 {
        int result;
+       int i;
 
        init_int_handler();
 
@@ -162,7 +215,9 @@ int main()
        //result = ltt_marker_connect("metadata", "testev", "default");
        //if(result)
        //      ERR("ltt_marker_connect");
-
+       result = ltt_marker_connect("foo", "bar", "default");
+       if(result)
+               ERR("ltt_marker_connect");
 
        result = ltt_trace_setup(trace_name);
        if(result < 0) {
@@ -192,19 +247,23 @@ int main()
        printf("Hello, World!\n");
 
        sleep(1);
-       for(;;) {
+       for(i=0; i<50; i++) {
                //trace_mark(abc, testmark, "", MARK_NOARGS);
                //trace_mark(metadata, testev, "", MARK_NOARGS);
-               trace_mark(metadata, core_marker_id,
-                          "channel %s name %s event_id %hu "
-                          "int #1u%zu long #1u%zu pointer #1u%zu "
-                          "size_t #1u%zu alignment #1u%u",
-                          "abc", "def", (unsigned short)1000,
-                          sizeof(int), sizeof(long), sizeof(void *),
-                          sizeof(size_t), ltt_get_alignment());
+               trace_mark(foo, bar, "%s", "FOOBAZ");
+               //trace_mark(metadata, core_marker_id,
+               //         "channel %s name %s event_id %hu "
+               //         "int #1u%zu long #1u%zu pointer #1u%zu "
+               //         "size_t #1u%zu alignment #1u%u",
+               //         "abc", "def", (unsigned short)1000,
+               //         sizeof(int), sizeof(long), sizeof(void *),
+               //         sizeof(size_t), ltt_get_alignment());
                usleep(100000);
        }
 
+       ltt_trace_stop(trace_name);
+       ltt_trace_destroy(trace_name);
+
        scanf("%*s");
 
        return 0;
This page took 0.026065 seconds and 4 git commands to generate.