10 extern mutex cerr_mutex;
11 extern std::map<std::thread::id, int> thread_name_map;
12 extern int next_thread_num;
13 extern std::map<void *, int> instance_name_map;
14 extern int next_instance_num;
15 extern char tprintf_thread_prefix;
18 struct iterator_pair : public std::pair<A, A> {
19 explicit iterator_pair(const A & first, const A & second) : std::pair<A, A>(first, second) {}
23 const struct iterator_pair<A> make_iterator_pair(const A & first, const A & second) {
24 return iterator_pair<A>(first, second);
27 template <class A, class B>
28 std::ostream & operator<<(std::ostream &o, const std::pair<A,B> &d) {
29 o << "<" << d.first << "," << d.second << ">";
34 std::ostream & operator<<(std::ostream &o, const iterator_pair<A> &d) {
36 for (auto i=d.first; i!=d.second; i++) {
46 #define LOG_PREFIX { \
48 auto _thread_ = std::this_thread::get_id(); \
49 int _tid_ = thread_name_map[_thread_]; \
51 _tid_ = thread_name_map[_thread_] = ++next_thread_num; \
52 auto _utime_ = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() % 1000000000; \
53 std::cerr << std::setfill('0') << std::dec << std::left << std::setw(9) << _utime_ << " "; \
54 std::cerr << tprintf_thread_prefix << std::left << std::setw(2) << _tid_; \
55 std::cerr << " " << std::setw(20) << __FILE__ << " " << std::setw(18) << __func__; \
57 #define LOG_THIS_POINTER { \
58 int _self_ = instance_name_map[this]; \
60 _self_ = instance_name_map[this] = ++next_instance_num; \
61 std::cerr << "#" << std::setw(2) << _self_; \
63 #define LOG_SUFFIX { \
64 cerr_mutex.unlock(); \
67 #define LOG_NONMEMBER(_x_) { \
69 std::cerr << _x_ << std::endl; \
75 std::cerr << _x_ << std::endl; \
78 #define LOG_FUNC_ENTER { \
81 std::cerr << "lid=" << lid; \
82 std::cerr << std::endl; \
85 #define LOG_FUNC_ENTER_SERVER { \
88 std::cerr << "lid=" << lid; \
89 std::cerr << " client=" << id << "," << xid; \
90 std::cerr << std::endl; \
93 #define LOG_FUNC_EXIT { \
96 std::cerr << "return" << lid; \
97 std::cerr << std::endl; \
101 #define tprintf(...) { \
102 char *buf = nullptr; \
103 int len = asprintf(&buf, __VA_ARGS__); \
104 if (buf[len-1]=='\n') \
106 LOG_NONMEMBER(buf); \