root / trunk / src / dot / proxy / log.h

Revision 7618, 4.3 kB (checked in by BradNeuberg, 22 months ago)

Local and remote SVN repositories somehow became out of sync and corrupted -- re-adding these in

Line 
1/*
2Copyright (c) 2003-2006 by Juliusz Chroboczek
3
4Permission is hereby granted, free of charge, to any person obtaining a copy
5of this software and associated documentation files (the "Software"), to deal
6in the Software without restriction, including without limitation the rights
7to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8copies of the Software, and to permit persons to whom the Software is
9furnished to do so, subject to the following conditions:
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20THE SOFTWARE.
21*/
22
23#define L_ERROR 0x1
24#define L_WARN 0x2
25#define L_INFO 0x4
26#define L_FORBIDDEN 0x8
27#define L_UNCACHEABLE 0x10
28#define L_SUPERSEDED 0x20
29#define L_VARY 0x40
30
31#define D_SERVER_CONN 0x100
32#define D_SERVER_REQ 0x200
33#define D_CLIENT_CONN 0x400
34#define D_CLIENT_REQ 0x800
35#define D_ATOM_REFCOUNT 0x1000
36#define D_REFCOUNT 0x2000
37#define D_LOCK 0x4000
38#define D_OBJECT 0x8000
39#define D_OBJECT_DATA 0x10000
40#define D_SERVER_OFFSET 0x20000
41#define D_CLIENT_DATA 0x40000
42#define D_DNS 0x80000
43#define D_CHILD 0x100000
44#define D_IO 0x200000
45
46#define LOGGING_DEFAULT (L_ERROR | L_WARN | L_INFO)
47#define LOGGING_MAX 0xFF
48
49extern AtomPtr logFile;
50extern FILE *logF;
51
52void preinitLog(void);
53void initLog(void);
54void reopenLog(void);
55
56void really_do_log(int type, const char *f, ...)
57    ATTRIBUTE ((format (printf, 2, 3)));
58void really_do_log_v(int type, const char *f, va_list args)
59    ATTRIBUTE ((format (printf, 2, 0)));
60void really_do_log_n(int type, const char *s, int n);
61void really_do_log_error(int type, int e, const char *f, ...)
62    ATTRIBUTE ((format (printf, 3, 4)));
63void really_do_log_error_v(int type, int e, const char *f, va_list args)
64    ATTRIBUTE ((format (printf, 3, 0)));
65
66#ifdef __GNUC__
67#define DO_BACKTRACE()                  \
68  do {                                  \
69    int n;                              \
70    void *buffer[10];                   \
71    n = backtrace(buffer, 5);           \
72    fflush(stderr);                     \
73    backtrace_symbols_fd(buffer, n, 2); \
74 } while(0)
75#else
76#define DO_BACKTRACE() /* */
77#endif
78
79/* These are macros because it's important that they should be
80   optimised away. */
81
82#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
83
84#define do_log(_type, ...)                                           \
85    do {                                                             \
86        if((_type) & (LOGGING_MAX)) really_do_log((_type), __VA_ARGS__); \
87    } while(0)
88#define do_log_error(_type, _e, ...)                                 \
89    do {                                                             \
90        if((_type) & (LOGGING_MAX))                                  \
91            really_do_log_error((_type), (_e), __VA_ARGS__);         \
92    } while(0)
93
94#elif defined(__GNUC__)
95
96#define do_log(_type, _args...)                                \
97    do {                                                       \
98        if((_type) & (LOGGING_MAX)) really_do_log((_type), _args); \
99    } while(0)
100#define do_log_error(_type, _e, _args...)                      \
101    do {                                                       \
102        if((_type) & (LOGGING_MAX))                            \
103            really_do_log_error((_type), (_e), _args);         \
104    } while(0)
105
106#else
107
108/* No variadic macros -- let's hope inline works. */
109
110static inline void 
111do_log(int type, const char *f, ...)
112{
113    va_list args;
114
115    va_start(args, f);
116    if((type & (LOGGING_MAX)) != 0)
117        really_do_log_v(type, f, args);
118    va_end(args);
119}
120
121static inline void
122do_log_error(int type, int e, const char *f, ...)
123{
124    va_list args;
125
126    va_start(args, f);
127    if((type & (LOGGING_MAX)) != 0)
128        really_do_log_error_v(type, e, f, args);
129    va_end(args);
130}   
131
132#endif
133
134#define do_log_n(_type, _s, _n) \
135    do { \
136        if((_type) & (LOGGING_MAX)) really_do_log_n((_type), (_s), (_n)); \
137    } while(0)
Note: See TracBrowser for help on using the browser.