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