Imported from 6.824 labs
[invirt/third/libt4.git] / tprintf.h
1 #ifndef TPRINTF_H
2 #define TPRINTF_H
3
4 #include <iomanip>
5 #include <iostream>
6 #include "mutex.h"
7 #include <time.h>
8 #include <stdio.h>
9 #include <map>
10
11 extern mutex cerr_mutex;
12 extern std::map<pthread_t, int> thread_name_map;
13 extern int next_thread_num;
14 extern std::map<void *, int> instance_name_map;
15 extern int next_instance_num;
16 extern char tprintf_thread_prefix;
17
18 #define LOG_PREFIX { \
19     cerr_mutex.acquire(); \
20     pthread_t self = pthread_self(); \
21     int tid = thread_name_map[self]; \
22     if (tid==0) \
23         tid = thread_name_map[self] = ++next_thread_num; \
24     std::cerr << std::left << std::setw(9) << utime() << " "; \
25     std::cerr << tprintf_thread_prefix << std::left << std::setw(2) << tid; \
26     std::cerr << " " << std::setw(24) << __FILE__ << " " << std::setw(18) << __func__; \
27 }
28 #define LOG_THIS_POINTER { \
29     int self = instance_name_map[this]; \
30     if (self==0) \
31         self = instance_name_map[this] = ++next_instance_num; \
32     std::cerr << "#" << std::setw(2) << self; \
33 }
34 #define LOG_SUFFIX { \
35     cerr_mutex.release(); \
36 }
37
38 #define LOG_NONMEMBER(x) { \
39     LOG_PREFIX; \
40     std::cerr << x << std::endl; \
41     LOG_SUFFIX; \
42 }
43 #define LOG(x) { \
44     LOG_PREFIX; \
45     LOG_THIS_POINTER; \
46     std::cerr << x << std::endl; \
47     LOG_SUFFIX; \
48 }
49 #define JOIN(from,to,sep) ({ \
50     ostringstream oss; \
51     for(typeof(from) i=from;i!=to;i++) \
52         oss << *i << sep; \
53     oss.str(); \
54 })
55 #define LOG_FUNC_ENTER { \
56     LOG_PREFIX; \
57     LOG_THIS_POINTER; \
58     std::cerr << "lid=" << lid; \
59     std::cerr << std::endl; \
60     LOG_SUFFIX; \
61 }
62 #define LOG_FUNC_ENTER_SERVER { \
63     LOG_PREFIX; \
64     LOG_THIS_POINTER; \
65     std::cerr << "lid=" << lid; \
66     std::cerr << " client=" << id << "," << xid; \
67     std::cerr << std::endl; \
68     LOG_SUFFIX; \
69 }
70 #define LOG_FUNC_EXIT { \
71     LOG_PREFIX; \
72     LOG_THIS_POINTER; \
73     std::cerr << "return" << lid; \
74     std::cerr << std::endl; \
75     LOG_SUFFIX; \
76 }
77
78 #define tprintf(args...) { \
79     int len = snprintf(NULL, 0, args); \
80     char buf[len+1]; \
81     buf[len] = '\0'; \
82     snprintf(buf, len+1, args); \
83     if (buf[len-1]=='\n') \
84         buf[len-1] = '\0'; \
85     LOG_NONMEMBER(buf); \
86 }
87
88 uint64_t utime();
89
90 #endif