49 #define SIONDEBFUNCNAMELEN 50 50 #define MAXOMPTHREADS 300 53 int _sion_get_thread_num_default();
54 static int (*_sion_my_get_thread_num)() = _sion_get_thread_num_default;
57 static int _sion_debug_first[MAXOMPTHREADS] = {1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
58 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
59 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
60 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
61 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
63 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
64 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
65 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
66 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
67 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
69 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
70 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
71 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
72 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
73 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1};
76 static FILE *_sion_debug_out[MAXOMPTHREADS] = {NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
77 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
78 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
79 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
80 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
81 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
82 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
83 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
84 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
85 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
87 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
88 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
89 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
90 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
91 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
92 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
93 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
94 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
95 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
96 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
98 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
99 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
100 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
101 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
102 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
103 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
104 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
105 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
106 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,
107 NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL};
110 static int _sion_debug_isdebug[MAXOMPTHREADS] = {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
111 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
112 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
113 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
114 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
116 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
117 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
118 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
119 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
120 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
122 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
123 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
124 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
125 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
126 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
129 static int _sion_debug_myrank[MAXOMPTHREADS] = {-1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
130 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
131 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
132 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
133 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
135 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
136 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
137 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
138 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
139 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
141 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
142 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
143 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
144 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1,
145 -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1};
147 static int _sion_debug_debmask = 1023;
148 static int _sion_debug_debrank1 = -1;
149 static int _sion_debug_debrank2 = -1;
150 static int _sion_debug_silent = 0;
151 static int _sion_debug_isinit = 0;
152 static char * _sion_debug_fn = NULL;
154 #define _DEBUG_INIT_THREAD \ 156 threadid = _sion_my_get_thread_num(); \ 157 if(threadid>MAXOMPTHREADS) threadid=(MAXOMPTHREADS-1); 161 int _sion_get_thread_num_default() {
166 int _sion_debug_set_query_thread_num_function(
int (*get_thread_num)() ) {
168 _sion_my_get_thread_num=get_thread_num;
182 if (_sion_debug_first[threadid])
185 if ((!_sion_debug_isdebug[threadid]) || !(mask & _sion_debug_debmask))
188 fprintf(_sion_debug_out[threadid],
" ");
190 va_start(ap, format);
192 vfprintf(_sion_debug_out[threadid], format, ap);
203 int sion_dprintfp(
int mask,
const char *callfunction,
int rank,
const char *format, ...)
206 char tmpfuncname[SIONDEBFUNCNAMELEN + 1];
208 int setrank = 0, norank = 0;
211 if ((_sion_debug_myrank[threadid] < 0) && (rank < 0)) {
217 rank = _sion_debug_myrank[threadid];
222 if (_sion_debug_myrank[threadid] < 0) {
223 _sion_debug_myrank[threadid] = rank;
229 if (_sion_debug_first[threadid])
234 if ((!_sion_debug_isdebug[threadid]) || !(mask & _sion_debug_debmask))
236 if ((_sion_debug_debrank1 >= 0) && (_sion_debug_debrank2 >= 0)) {
237 if ((rank != _sion_debug_debrank1) && (rank != _sion_debug_debrank2))
240 else if (_sion_debug_debrank1 >= 0) {
241 if (rank != _sion_debug_debrank1)
245 if (strlen(callfunction) > SIONDEBFUNCNAMELEN) {
246 strncpy(tmpfuncname, callfunction, SIONDEBFUNCNAMELEN);
247 tmpfuncname[SIONDEBFUNCNAMELEN] =
'\0';
250 strcpy(tmpfuncname, callfunction);
252 sprintf(spec,
"SION[%s%s%%5d][%%-%ds] ", (setrank ?
"S" :
" "), (norank ?
"N" :
" "), SIONDEBFUNCNAMELEN);
253 fprintf(_sion_debug_out[threadid], spec, rank, tmpfuncname);
255 fprintf(_sion_debug_out[threadid],
" ");
257 fprintf(_sion_debug_out[threadid],
" ");
259 fprintf(_sion_debug_out[threadid],
" ");
261 va_start(ap, format);
263 vfprintf(_sion_debug_out[threadid], format, ap);
267 fflush(_sion_debug_out[threadid]);
278 if (_sion_debug_first[threadid])
281 return _sion_debug_out[threadid];
290 if (_sion_debug_out[threadid] && (_sion_debug_out[threadid] != stdout) && (_sion_debug_out[threadid] != stderr)) {
291 fclose(_sion_debug_out[threadid]);
292 _sion_debug_out[threadid] = NULL;
293 _sion_debug_first[threadid] = 1;
297 int sion_isdebug(
void)
300 if (_sion_debug_first[threadid])
303 return _sion_debug_isdebug[threadid] ? _sion_debug_debmask : 0;
318 if (_sion_debug_out[threadid])
321 _sion_debug_first[threadid] = 0;
324 fname = (
char *) malloc((strlen(filename) + 1) *
sizeof(char));
325 strcpy(fname, filename);
329 if (!fname || (strlen(fname) == 0) || !strcmp(fname,
"stderr")) {
330 _sion_debug_out[threadid] = stderr;
332 else if (!strcmp(fname,
"stdout")) {
333 _sion_debug_out[threadid] = stdout;
335 else if (!(_sion_debug_out[threadid] = fopen(fname,
"w"))) {
336 fprintf(stderr,
"sion_dprintf: failed to open '%s' for writing\n", fname);
337 _sion_debug_out[threadid] = stderr;
340 #ifdef SION_DEBUG_EXTREME 341 fprintf(stderr,
"Warning: you are using a version of SION that is configured with -DEBUG (current debug-mask is %d\n", debmask);
344 if ((_sion_debug_out[threadid] != stdout) && (_sion_debug_out[threadid] != stderr))
345 fprintf(stderr,
"Writing debug output to %s\n", fname);
350 _sion_debug_debmask = mask;
351 _sion_debug_isdebug[threadid] = 1;
354 void sion_debug_off(
void)
357 _sion_debug_isdebug[threadid] = 0;
374 if (_sion_debug_first[threadid]) {
377 _sion_debug_first[threadid] = 0;
378 _sion_debug_isdebug[threadid] = 0;
382 if(_sion_debug_isinit) {
389 _sion_debug_debrank1 = atoi(t);
393 _sion_debug_debrank1 = atoi(t);
397 _sion_debug_debrank2 = atoi(t);
401 _sion_debug_fn = (
char *) t;
406 _sion_debug_debmask = atoi(t);
410 _sion_debug_silent = atoi(t);
412 _sion_debug_isinit=1;
416 if (_sion_debug_fn) {
417 _sion_debug_isdebug[threadid] = 1;
420 if ((_sion_debug_debrank1 >= 0) && (_sion_debug_debrank2 >= 0)) {
421 if ((_sion_debug_myrank[threadid] != _sion_debug_debrank1) && (_sion_debug_myrank[threadid] != _sion_debug_debrank2))
422 _sion_debug_isdebug[threadid] = 0;
424 else if (_sion_debug_debrank1 >= 0) {
425 if (_sion_debug_myrank[threadid] != _sion_debug_debrank1)
426 _sion_debug_isdebug[threadid] = 0;
429 if ((_sion_debug_debrank1 == -2) && (_sion_debug_debrank2 == -2)) {
430 _sion_debug_isdebug[threadid] = 1;
432 if (_sion_debug_isdebug[threadid]) {
434 if ((_sion_debug_fn == 0) || (strlen(_sion_debug_fn) == 0) || !strcmp(_sion_debug_fn,
"stderr")) {
435 _sion_debug_out[threadid] = stderr;
437 else if (!strcmp(_sion_debug_fn,
"stdout")) {
438 _sion_debug_out[threadid] = stdout;
441 filename=malloc((strlen(_sion_debug_fn) + 1 + 10) *
sizeof(
char));
442 sprintf(filename,
"%s.%05d", _sion_debug_fn, _sion_debug_myrank[threadid]);
444 if (!(_sion_debug_out[threadid] = fopen(filename,
"a"))) {
445 fprintf(_sion_debug_out[threadid],
"sion_dprintf: failed to open '%s' for writing\n", filename);
449 if( rvalue && ((_sion_debug_out[threadid] != stdout) && (_sion_debug_out[threadid] != stderr)) && (!_sion_debug_silent) )
450 fprintf(stderr,
"Writing debug output to %s\n", filename);
454 if (filename) free(filename);
458 #ifdef SION_DEBUG_EXTREME 459 fprintf(stderr,
"Warning: you are using a version of SION that is configured with --with-debug (current debug-mask is %d)\n", _sion_debug_debmask);
void sion_debug_on(int mask, const char *filename)
sets debug mode.
int sion_dprintf(int mask, const char *format,...)
Print debugging info formating the message like printf.
char * _sion_getenv(const char *name)
int _sion_debug_init(void)
initialize the debug environment
int sion_dprintfp(int mask, const char *callfunction, int rank, const char *format,...)
Print debugging info formating the message like printf and including the name of the calling function...
FILE * sion_get_dfile(void)