9 #define _XOPEN_SOURCE 700 20 #include "sion_error_handler.h" 23 #define MAXOMPTHREADS 300 25 int _sion_error_get_thread_num_default(
void);
26 static int (*_sion_my_get_thread_num)(void) = _sion_error_get_thread_num_default;
29 static int _sion_errorprint_flag[MAXOMPTHREADS] = {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
30 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
31 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
32 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
33 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
35 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
36 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
37 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
38 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
39 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
41 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
42 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
43 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
44 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
45 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
47 #define _ERRORHANDLER_INIT_THREAD \ 49 threadid = _sion_my_get_thread_num(); \ 50 if(threadid>MAXOMPTHREADS) threadid=(MAXOMPTHREADS-1); 53 int _sion_error_get_thread_num_default(
void) {
58 int _sion_error_set_query_thread_num_function(
int (*get_thread_num)(
void) ) {
60 _sion_my_get_thread_num=get_thread_num;
66 int _sion_errorprint_set_flag(
int flag)
69 _ERRORHANDLER_INIT_THREAD
71 _sion_errorprint_flag[threadid]=flag;
81 int _sion_errorprint(
int rc,
int level,
const char *format, ...)
88 rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
94 int _sion_errorprint_on_rank(
int rc,
int level,
int rank,
const char *format, ...)
100 va_start(ap, format);
101 rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
108 int __sion_errorprint_vargs(
int rc,
int level,
int rank,
int thread,
const char *format, va_list ap) {
114 _ERRORHANDLER_INIT_THREAD
119 if (t) rankselect = atoi(t);
120 if((rankselect>=0) && (rank>=0)) do_print = (rankselect==rank);
124 if (t) threadselect = atoi(t);
125 if((threadselect>=0) && (thread>=0)) do_print = (threadselect==thread);
129 if(_sion_errorprint_flag[threadid] & _SION_ERROR_FLAG_SUPPRESS_MSG) do_print=0;
134 fprintf(stderr,
"%s on rank %d, thread %d, rc=%d: ", __sion_error_level_to_str(level),rank,thread,rc);
136 fprintf(stderr,
"%s on rank %d, rc=%d: ", __sion_error_level_to_str(level),rank,rc);
138 vfprintf(stderr, format, ap);
139 fprintf(stderr,
"\n");
143 case _SION_ERROR_RETURN:
146 case _SION_ERROR_WARN:
149 case _SION_ERROR_ABORT:
153 fprintf(stderr,
"ERROR in error handler: unknown level %d\n",level);
161 #define STR_PRT(X) case X: return # X 162 char* __sion_error_level_to_str (
unsigned int flag) {
164 case _SION_ERROR_RETURN:
return "SION_ERROR_RETURN";
165 case _SION_ERROR_WARN:
return "SION_ERROR_WARN";
166 case _SION_ERROR_ABORT:
return "SION_ERROR_ABORT";
167 default:
return "SION_ERROR_UNKNOWN";
char * _sion_getenv(const char *name)