00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00022 #ifndef GLOBUS_DEBUG_H
00023 #define GLOBUS_DEBUG_H
00024
00025 #include "globus_common_include.h"
00026 #include "globus_time.h"
00027
00028 #ifdef __cplusplus
00029 extern "C" {
00030 #endif
00031
00032 #ifdef BUILD_DEBUG
00033
00034 typedef struct
00035 {
00036 unsigned levels;
00037 unsigned timestamp_levels;
00038 FILE * file;
00039 globus_bool_t thread_ids;
00040 globus_bool_t using_file;
00041 } globus_debug_handle_t;
00042
00043 void
00044 globus_debug_init(
00045 const char * env_name,
00046 const char * level_names,
00047 globus_debug_handle_t * handle);
00048
00049 #define GlobusDebugThreadId() globus_thread_self()
00050
00051
00052 #define GlobusDebugDefine(module_name) \
00053 extern globus_debug_handle_t globus_i_##module_name##_debug_handle; \
00054 void globus_i_##module_name##_debug_printf(const char * fmt, ...) \
00055 { \
00056 va_list ap; \
00057 \
00058 if(!globus_i_##module_name##_debug_handle.file) \
00059 return; \
00060 \
00061 va_start(ap, fmt); \
00062 if(globus_i_##module_name##_debug_handle.thread_ids) \
00063 { \
00064 char buf[4096]; \
00065 sprintf( \
00066 buf, "%lu::%s", (unsigned long) globus_thread_self().dummy, fmt);\
00067 vfprintf(globus_i_##module_name##_debug_handle.file, buf, ap); \
00068 } \
00069 else \
00070 { \
00071 vfprintf(globus_i_##module_name##_debug_handle.file, fmt, ap); \
00072 } \
00073 va_end(ap); \
00074 } \
00075 void globus_i_##module_name##_debug_time_printf(const char * fmt, ...) \
00076 { \
00077 va_list ap; \
00078 char buf[4096]; \
00079 globus_abstime_t current_time; \
00080 \
00081 if(!globus_i_##module_name##_debug_handle.file) \
00082 return; \
00083 \
00084 GlobusTimeAbstimeGetCurrent(current_time); \
00085 va_start(ap, fmt); \
00086 if(globus_i_##module_name##_debug_handle.thread_ids) \
00087 { \
00088 globus_thread_t __self = GlobusDebugThreadId(); \
00089 sprintf(buf, "%lu:%lu.%.9lu::%s", \
00090 (unsigned long) __self.dummy, \
00091 (unsigned long) current_time.tv_sec, \
00092 (unsigned long) current_time.tv_nsec, \
00093 fmt); \
00094 vfprintf(globus_i_##module_name##_debug_handle.file, buf, ap); \
00095 } \
00096 else \
00097 { \
00098 sprintf(buf, "%lu.%.9lu::%s", \
00099 (unsigned long) current_time.tv_sec, \
00100 (unsigned long) current_time.tv_nsec, \
00101 fmt); \
00102 vfprintf(globus_i_##module_name##_debug_handle.file, buf, ap); \
00103 } \
00104 va_end(ap); \
00105 } \
00106 void globus_i_##module_name##_debug_fwrite( \
00107 const void *ptr, size_t size, size_t nmemb) \
00108 { \
00109 if(globus_i_##module_name##_debug_handle.file) \
00110 fwrite(ptr, size, nmemb, \
00111 globus_i_##module_name##_debug_handle.file); \
00112 } \
00113 globus_debug_handle_t globus_i_##module_name##_debug_handle
00114
00115
00116 #define GlobusDebugDeclare(module_name) \
00117 extern void globus_i_##module_name##_debug_printf(const char *, ...); \
00118 extern void globus_i_##module_name##_debug_time_printf(const char *, ...);\
00119 extern void globus_i_##module_name##_debug_fwrite( \
00120 const void *ptr, size_t size, size_t nmemb); \
00121 extern globus_debug_handle_t globus_i_##module_name##_debug_handle
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 #define GlobusDebugInit(module_name, levels) \
00144 globus_debug_init( \
00145 #module_name "_DEBUG", \
00146 #levels, \
00147 &globus_i_##module_name##_debug_handle)
00148
00149
00150 #define GlobusDebugDestroy(module_name) \
00151 do \
00152 { \
00153 if(globus_i_##module_name##_debug_handle.using_file) \
00154 { \
00155 fclose(globus_i_##module_name##_debug_handle.file); \
00156 } \
00157 globus_i_##module_name##_debug_handle.file = GLOBUS_NULL; \
00158 } while(0)
00159
00160
00161
00162
00163 #define GlobusDebugMyPrintf(module_name, message) \
00164 globus_i_##module_name##_debug_printf message
00165 #define GlobusDebugMyTimePrintf(module_name, message) \
00166 globus_i_##module_name##_debug_time_printf message
00167
00168 #define GlobusDebugMyFwrite(module_name, buffer, size, count) \
00169 globus_i_##module_name##_debug_fwrite((buffer), (size), (count))
00170
00171 #define GlobusDebugMyFile(module_name) \
00172 (globus_i_##module_name##_debug_handle.file)
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 #define GlobusDebugTrue(module_name, level) \
00184 (globus_i_##module_name##_debug_handle.levels & (level))
00185
00186 #define GlobusDebugTimeTrue(module_name, level) \
00187 (globus_i_##module_name##_debug_handle.timestamp_levels & (level))
00188
00189
00190
00191
00192
00193
00194 #define GlobusDebugPrintf(module_name, level, message) \
00195 do \
00196 { \
00197 if(GlobusDebugTrue(module_name, level)) \
00198 { \
00199 if(!GlobusDebugTimeTrue(module_name, level)) \
00200 { \
00201 GlobusDebugMyPrintf(module_name, message); \
00202 } \
00203 else \
00204 { \
00205 GlobusDebugMyTimePrintf(module_name, message); \
00206 } \
00207 } \
00208 } while(0)
00209
00210 #define GlobusDebugFwrite(module_name, level, buffer, size, count) \
00211 do \
00212 { \
00213 if(GlobusDebugTrue(module_name, level)) \
00214 { \
00215 GlobusDebugMyFwrite(module_name, buffer, size, count); \
00216 } \
00217 } while(0)
00218
00219 #else
00220
00221 #define GlobusDebugThreadId() 0
00222 #define GlobusDebugDeclare(module_name)
00223 #define GlobusDebugDefine(module_name)
00224 #define GlobusDebugInit(module_name, levels) do {} while(0)
00225 #define GlobusDebugDestroy(module_name) do {} while(0)
00226 #define GlobusDebugPrintf(module_name, level, message) do {} while(0)
00227 #define GlobusDebugFwrite(module_name, level, buffer, size, count) \
00228 do {} while(0)
00229 #define GlobusDebugMyPrintf(module_name, message) do {} while(0)
00230 #define GlobusDebugMyTimePrintf(module_name, message) do {} while(0)
00231 #define GlobusDebugMyFwrite(module_name, buffer, size, count) do {} while(0)
00232 #define GlobusDebugMyFile(module_name) (stderr)
00233 #define GlobusDebugTrue(module_name, level) 0
00234 #define GlobusDebugTimeTrue(module_name, level) 0
00235
00236 #endif
00237
00238 #ifdef __cplusplus
00239 }
00240 #endif
00241
00242 #endif