18 #include "sion_error_handler.h" 21 #define MAXOMPTHREADS 300 23 int _sion_error_get_thread_num_default();
24 static int (*_sion_my_get_thread_num)() = _sion_error_get_thread_num_default;
27 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,
28 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
29 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,
33 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
34 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,
39 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
40 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};
45 #define _ERRORHANDLER_INIT_THREAD \ 47 threadid = _sion_my_get_thread_num(); \ 48 if(threadid>MAXOMPTHREADS) threadid=(MAXOMPTHREADS-1); 51 int _sion_error_get_thread_num_default() {
56 int _sion_error_set_query_thread_num_function(
int (*get_thread_num)() ) {
58 _sion_my_get_thread_num=get_thread_num;
64 int _sion_errorprint_set_flag(
int flag)
67 _ERRORHANDLER_INIT_THREAD
69 _sion_errorprint_flag[threadid]=flag;
79 int _sion_errorprint(
int rc,
int level,
const char *format, ...)
86 rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
92 int _sion_errorprint_on_rank(
int rc,
int level,
int rank,
const char *format, ...)
99 rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
106 int __sion_errorprint_vargs(
int rc,
int level,
int rank,
int thread,
const char *format, va_list ap) {
112 _ERRORHANDLER_INIT_THREAD
117 if (t) rankselect = atoi(t);
118 if((rankselect>=0) && (rank>=0)) do_print = (rankselect==rank);
122 if (t) threadselect = atoi(t);
123 if((threadselect>=0) && (thread>=0)) do_print = (threadselect==thread);
127 if(_sion_errorprint_flag[threadid] & _SION_ERROR_FLAG_SUPPRESS_MSG) do_print=0;
132 fprintf(stderr,
"%s on rank %d, thread %d, rc=%d: ", __sion_error_level_to_str(level),rank,thread,rc);
134 fprintf(stderr,
"%s on rank %d, rc=%d: ", __sion_error_level_to_str(level),rank,rc);
136 vfprintf(stderr, format, ap);
137 fprintf(stderr,
"\n");
141 case _SION_ERROR_RETURN:
144 case _SION_ERROR_WARN:
147 case _SION_ERROR_ABORT:
151 fprintf(stderr,
"ERROR in error handler: unknown level %d\n",level);
159 #define STR_PRT(X) case X: return # X 160 char* __sion_error_level_to_str (
unsigned int flag) {
162 case _SION_ERROR_RETURN:
return "SION_ERROR_RETURN";
163 case _SION_ERROR_WARN:
return "SION_ERROR_WARN";
164 case _SION_ERROR_ABORT:
return "SION_ERROR_ABORT";
165 default:
return "SION_ERROR_UNKNOWN";
char * _sion_getenv(const char *name)