SIONlib  1.7.4
Scalable I/O library for parallel access to task-local files
sion_error_handler.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 #define _XOPEN_SOURCE 700
10 
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <stdarg.h>
14 #include <string.h>
15 #include <time.h>
16 
17 #include "sion.h"
18 #include "sion_debug.h"
19 #include "sion_lock.h"
20 #include "sion_error_handler.h"
21 #include "sion_internal.h"
22 
23 #define MAXOMPTHREADS 300
24 
25 int _sion_error_get_thread_num_default(void);
26 static int (*_sion_my_get_thread_num)(void) = _sion_error_get_thread_num_default;
27 
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,
34 
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,
40 
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};
46 
47 #define _ERRORHANDLER_INIT_THREAD \
48  int threadid=0; \
49  threadid = _sion_my_get_thread_num(); \
50  if(threadid>MAXOMPTHREADS) threadid=(MAXOMPTHREADS-1);
51 
52 /* default thread number */
53 int _sion_error_get_thread_num_default(void) {
54  return(0);
55 }
56 
57 /* default thread number */
58 int _sion_error_set_query_thread_num_function( int (*get_thread_num)(void) ) {
59  _sion_lock();
60  _sion_my_get_thread_num=get_thread_num;
61  _sion_unlock();
62  return(1);
63 }
64 
65 
66 int _sion_errorprint_set_flag( int flag)
67 {
68  int rc=SION_SUCCESS;
69  _ERRORHANDLER_INIT_THREAD
70 
71  _sion_errorprint_flag[threadid]=flag;
72 
73  return (rc);
74 }
75 
76 
81 int _sion_errorprint(int rc, int level, const char *format, ...)
82 {
83  int rank=-1;
84  int thread=-1;
85  va_list ap;
86 
87  va_start(ap, format);
88  rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
89  va_end(ap);
90 
91  return (rc);
92 }
93 
94 int _sion_errorprint_on_rank(int rc, int level, int rank, const char *format, ...)
95 {
96 
97  int thread=-1;
98  va_list ap;
99 
100  va_start(ap, format);
101  rc=__sion_errorprint_vargs(rc, level, rank, thread, format, ap);
102  va_end(ap);
103 
104  return (rc);
105 }
106 
107 
108 int __sion_errorprint_vargs(int rc, int level, int rank, int thread, const char *format, va_list ap) {
109 
110  int do_print=1;
111  char *t;
112  int rankselect=-1;
113  int threadselect=-1;
114  _ERRORHANDLER_INIT_THREAD
115 
116  /* check env */
117  if(do_print) {
118  t = _sion_getenv("SION_ERROR_MSG_RANK");
119  if (t) rankselect = atoi(t);
120  if((rankselect>=0) && (rank>=0)) do_print = (rankselect==rank);
121  }
122  if(do_print) {
123  t = _sion_getenv("SION_ERROR_MSG_THREAD");
124  if (t) threadselect = atoi(t);
125  if((threadselect>=0) && (thread>=0)) do_print = (threadselect==thread);
126  }
127 
128  if(do_print) {
129  if(_sion_errorprint_flag[threadid] & _SION_ERROR_FLAG_SUPPRESS_MSG) do_print=0;
130  }
131 
132  if(do_print) {
133  if(thread>=0) {
134  fprintf(stderr,"%s on rank %d, thread %d, rc=%d: ", __sion_error_level_to_str(level),rank,thread,rc);
135  } else {
136  fprintf(stderr,"%s on rank %d, rc=%d: ", __sion_error_level_to_str(level),rank,rc);
137  }
138  vfprintf(stderr, format, ap);
139  fprintf(stderr,"\n");
140  }
141 
142  switch (level) {
143  case _SION_ERROR_RETURN:
144  return (rc);
145  break;
146  case _SION_ERROR_WARN:
147  return (rc);
148  break;
149  case _SION_ERROR_ABORT:
150  exit (rc);
151  break;
152  default:
153  fprintf(stderr,"ERROR in error handler: unknown level %d\n",level);
154  return (rc);
155  }
156 
157  return (rc);
158 
159 }
160 
161 #define STR_PRT(X) case X: return # X
162 char* __sion_error_level_to_str (unsigned int flag) {
163  switch (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";
168  }
169  return "";
170 }
char * _sion_getenv(const char *name)