00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef _LOGGING_H_
00036 #define _LOGGING_H_
00037
00038 #include "config.h"
00039 #include <stdarg.h>
00040 #include <stdlib.h>
00041 #include <stdio.h>
00042 #ifdef HAVE_UNISTD_H
00043 #include <unistd.h>
00044 #endif
00045 #include <string.h>
00046 #include <assert.h>
00047 #include <errno.h>
00048 #include "base/commandlineflags.h"
00049
00050
00051
00052
00053
00054
00055 #ifdef HAVE_SYS_SYSCALL_H
00056 #include <sys/syscall.h>
00057 #define WRITE_TO_STDERR(buf, len) syscall(SYS_write, STDERR_FILENO, buf, len)
00058 #else
00059 #define WRITE_TO_STDERR(buf, len) write(STDERR_FILENO, buf, len)
00060 #endif
00061
00062
00063
00064
00065 DECLARE_int32(verbose);
00066
00067
00068
00069
00070
00071
00072
00073 #define CHECK(condition) \
00074 do { \
00075 if (!(condition)) { \
00076 WRITE_TO_STDERR("Check failed: " #condition "\n", \
00077 sizeof("Check failed: " #condition "\n")-1); \
00078 exit(1); \
00079 } \
00080 } while (0)
00081
00082
00083 #define RAW_CHECK(condition, message) \
00084 do { \
00085 if (!(condition)) { \
00086 WRITE_TO_STDERR("Check failed: " #condition ": " message "\n", \
00087 sizeof("Check failed: " #condition ": " message "\n")-1);\
00088 exit(1); \
00089 } \
00090 } while (0)
00091
00092
00093 #ifdef NDEBUG
00094 enum { DEBUG_MODE = 0 };
00095 #define RAW_DCHECK(condition, message)
00096 #else
00097 enum { DEBUG_MODE = 1 };
00098 #define RAW_DCHECK(condition, message) RAW_CHECK(condition, message)
00099 #endif
00100
00101
00102
00103 #define PCHECK(condition) \
00104 do { \
00105 if (!(condition)) { \
00106 const int err_no = errno; \
00107 WRITE_TO_STDERR("Check failed: " #condition ": ", \
00108 sizeof("Check failed: " #condition ": ")-1); \
00109 WRITE_TO_STDERR(strerror(err_no), strlen(strerror(err_no))); \
00110 WRITE_TO_STDERR("\n", sizeof("\n")-1); \
00111 exit(1); \
00112 } \
00113 } while (0)
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 #define CHECK_OP(op, val1, val2) \
00125 do { \
00126 if (!((val1) op (val2))) { \
00127 fprintf(stderr, "Check failed: %s %s %s\n", #val1, #op, #val2); \
00128 exit(1); \
00129 } \
00130 } while (0)
00131
00132 #define CHECK_EQ(val1, val2) CHECK_OP(==, val1, val2)
00133 #define CHECK_NE(val1, val2) CHECK_OP(!=, val1, val2)
00134 #define CHECK_LE(val1, val2) CHECK_OP(<=, val1, val2)
00135 #define CHECK_LT(val1, val2) CHECK_OP(< , val1, val2)
00136 #define CHECK_GE(val1, val2) CHECK_OP(>=, val1, val2)
00137 #define CHECK_GT(val1, val2) CHECK_OP(> , val1, val2)
00138
00139
00140 #define CHECK_ERR(invocation) PCHECK((invocation) != -1)
00141
00142
00143 #ifdef NDEBUG
00144 #define DCHECK_EQ(val1, val2)
00145 #define DCHECK_NE(val1, val2)
00146 #define DCHECK_LE(val1, val2)
00147 #define DCHECK_LT(val1, val2)
00148 #define DCHECK_GE(val1, val2)
00149 #define DCHECK_GT(val1, val2)
00150 #else
00151 #define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
00152 #define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)
00153 #define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)
00154 #define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)
00155 #define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)
00156 #define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)
00157 #endif
00158
00159
00160 #ifdef ERROR
00161 #undef ERROR // may conflict with ERROR macro on windows
00162 #endif
00163 enum {INFO = -1, WARNING = -2, ERROR = -3, FATAL = -4};
00164
00165
00166 inline void LogPrintf(int severity, const char* pat, va_list ap) {
00167
00168
00169 char buf[600];
00170 vsnprintf(buf, sizeof(buf)-1, pat, ap);
00171 if (buf[0] != '\0' && buf[strlen(buf)-1] != '\n') {
00172 assert(strlen(buf)+1 < sizeof(buf));
00173 strcat(buf, "\n");
00174 }
00175 WRITE_TO_STDERR(buf, strlen(buf));
00176 if ((severity) == FATAL)
00177 abort();
00178 }
00179
00180
00181
00182
00183 #define VLOG_IS_ON(severity) (FLAGS_verbose >= severity)
00184
00185
00186 #define LOG_PRINTF(severity, pat) do { \
00187 if (VLOG_IS_ON(severity)) { \
00188 va_list ap; \
00189 va_start(ap, pat); \
00190 LogPrintf(severity, pat, ap); \
00191 va_end(ap); \
00192 } \
00193 } while (0)
00194
00195
00196 inline void RAW_LOG(int lvl, const char* pat, ...) { LOG_PRINTF(lvl, pat); }
00197 inline void RAW_VLOG(int lvl, const char* pat, ...) { LOG_PRINTF(lvl, pat); }
00198 inline void LOG(int lvl, const char* pat, ...) { LOG_PRINTF(lvl, pat); }
00199 inline void VLOG(int lvl, const char* pat, ...) { LOG_PRINTF(lvl, pat); }
00200 inline void LOG_IF(int lvl, bool cond, const char* pat, ...) {
00201 if (cond) LOG_PRINTF(lvl, pat);
00202 }
00203
00204 #endif // _LOGGING_H_