tls
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 26 Jan 2006 14:24:48 +0000 (14:24 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 26 Jan 2006 14:24:48 +0000 (14:24 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1492 04897980-b3bd-0310-b5e0-8ef037075253

usertrace/Makefile
usertrace/lttng_usertrace.c
usertrace/lttng_usertrace.h
usertrace/test.c

index 049c44bf6981dd55daaaefbfc335ec6652fbbfe1..83c3b89f40d5aa71361f2dfb4dffb50021aaad00 100644 (file)
@@ -1,6 +1,9 @@
 
+
+CC=gcc
+
 test: test.c lttng_usertrace.c
-       $(CC) $(CFLAGS) -o $@ $^
+       $(CC) $(CFLAGS) -lpthread -o $@ $^
 
 .PHONY : clean
 
index b4de26767a11bcedfb88c23f5b8860c07e5c253c..f989667f07e1cc6c8a276e787e439072f03533ba 100644 (file)
@@ -9,19 +9,92 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <signal.h>
 #include <syscall.h>
+#include <features.h>
+#include <pthread.h>
+#include <malloc.h>
+#include <string.h>
 
+#include <asm/atomic.h>
 #include "lttng_usertrace.h"
 
+#define MAX_TRACES 16
+
+struct ltt_buf {
+       void *start;
+       atomic_t        offset;
+       atomic_t        reserve_count;
+       atomic_t        commit_count;
+
+       atomic_t        events_lost;
+};
+
+struct lttng_trace_info {
+       struct lttng_trace_info *next;
+       int     active:1;
+       struct {
+               struct ltt_buf facilities;
+               struct ltt_buf cpu;
+       } channel;
+};
+
+
+/* TLS for the trace info */
+static __thread struct lttng_trace_info *test;
+static __thread struct lttng_trace_info lttng_trace_info[MAX_TRACES];
+
+
 /* signal handler */
 void __lttng_sig_trace_handler(int signo)
 {
+       int ret;
+       sigset_t set, oldset;
+       
   printf("LTTng Sig handler : pid : %lu\n", getpid());
+
+       /* Disable signals */
+       ret = sigfillset(&set);
+       if(ret) {
+               printf("Error in sigfillset\n");
+               exit(1);
+       }
+       
+       ret = sigprocmask(SIG_BLOCK, &set, &oldset);
+       if(ret) {
+               printf("Error in sigprocmask\n");
+               exit(1);
+       }
+       
+       /* Get all the new traces */
+#if 0
+       do {
+               /* FIXME : allocate the trace structure somewhere : thread private */
+               ret = ltt_update(addr, &active, &filter);
+               
+               if(ret) {
+                       printf("Error in ltt_update system call\n");
+                       exit(1);
+               }
+       } while(addr);
+               
+#endif //0
+       /* Enable signals */
+       ret = sigprocmask(SIG_SETMASK, &oldset, NULL);
+       if(ret) {
+               printf("Error in sigprocmask\n");
+               exit(1);
+       }
+       
 }
 
 
+void __lttng_init_trace_info(void)
+{
+       memset(&lttng_trace_info, 0, MAX_TRACES*sizeof(struct lttng_trace_info));
+}
 
 void __attribute__((constructor)) __lttng_user_init(void)
 {
@@ -30,6 +103,9 @@ void __attribute__((constructor)) __lttng_user_init(void)
 
   printf("LTTng user init\n");
 
+       /* Init trace info */
+       __lttng_init_trace_info();
+       
        /* Activate the signal */
        act.sa_handler = __lttng_sig_trace_handler;
        err = sigemptyset(&(act.sa_mask));
@@ -39,10 +115,27 @@ void __attribute__((constructor)) __lttng_user_init(void)
        err = sigaction(SIGRTMIN+3, &act, NULL);
        if(err) perror("Error with sigaction");
 
+       /* TEST */
+       err = ltt_switch((unsigned long)NULL);
+       if(err) {
+               printf("Error in ltt_switch system call\n");
+               exit(1);
+       }
+
        /* Make the first ltt_update system call */
        err = ltt_update(1, NULL, NULL);
        if(err) {
                printf("Error in ltt_update system call\n");
                exit(1);
        }
+
+       /* Make some ltt_switch syscalls */
+       err = ltt_switch((unsigned long)NULL);
+       if(err) {
+               printf("Error in ltt_switch system call\n");
+               exit(1);
+       }
+
+
+
 }
index c16aa781bf958d7ead77a831c61ef87d58a4802d..b4aa8f3b6ed74a38a5c9110a6f2e1703ef24ac48 100644 (file)
@@ -26,6 +26,7 @@
 
 void __lttng_sig_trace_handler(int signo);
 
+static inline _syscall1(int, ltt_switch, unsigned long, addr)
 static inline _syscall3(int, ltt_update, unsigned long, addr, int *, active, int *, filter)
 
 #endif //_LTTNG_USERTRACE_H
index 0154f3ca7c0d3b6155ae44f91373ac5edb88feb6..9c772973f64842b260baf6e8be3b22de998a44d2 100644 (file)
@@ -1,13 +1,55 @@
 
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
 #include "lttng_usertrace.h"
 
+
+
+void *thr1(void *arg)
+{
+  printf("thread 1, thread id : %lu, pid %lu\n", pthread_self(), getpid());
+
+  while(1) {}
+
+  return ((void*)1);
+
+}
+
+void *thr2(void *arg)
+{
+  while(1) {
+    printf("thread 2, thread id : %lu, pid %lu\n", pthread_self(), getpid());
+    sleep(2);
+  }
+  return ((void*)2);
+}
+
+
 int main()
 {
+       int err;
+       pthread_t tid1, tid2;
+       void *tret;
+
+  err = pthread_create(&tid1, NULL, thr1, NULL);
+  if(err!=0) exit(1);
+
+  err = pthread_create(&tid2, NULL, thr2, NULL);
+  if(err!=0) exit(1);
 
   while(1)
   {
     
   }
+
+  err = pthread_join(tid1, &tret);
+  if(err!= 0) exit(1);
+
+  err = pthread_join(tid2, &tret);
+  if(err!= 0) exit(1);
   
   return 0;
 }
This page took 0.026132 seconds and 4 git commands to generate.