Changeset 2b8bc41
- Timestamp:
- Feb 6, 2018, 10:54:31 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 539cdfe
- Parents:
- 7d94d805
- Location:
- src/libcfa
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/libcfa/bits/signal.h ¶
r7d94d805 r2b8bc41 33 33 34 34 // Sigaction wrapper : register an signal handler 35 static void __ kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {35 static void __cfaabi_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) { 36 36 struct sigaction act; 37 37 … … 41 41 if ( sigaction( sig, &act, NULL ) == -1 ) { 42 42 __cfaabi_dbg_print_buffer_decl( 43 " __ kernel_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",43 " __cfaabi_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n", 44 44 sig, handler, flags, errno, strerror( errno ) 45 45 ); … … 49 49 50 50 // Sigaction wrapper : restore default handler 51 static void __ kernel_sigdefault( int sig ) {51 static void __cfaabi_sigdefault( int sig ) { 52 52 struct sigaction act; 53 53 … … 58 58 if ( sigaction( sig, &act, NULL ) == -1 ) { 59 59 __cfaabi_dbg_print_buffer_decl( 60 " __ kernel_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",60 " __cfaabi_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n", 61 61 sig, errno, strerror( errno ) 62 62 ); -
TabularUnified src/libcfa/concurrency/kernel.c ¶
r7d94d805 r2b8bc41 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Dec 8 16:23:33 201713 // Update Count : 312 // Last Modified On : Tue Feb 6 21:51:26 2018 13 // Update Count : 4 14 14 // 15 15 … … 588 588 } 589 589 590 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) { 591 return get_coroutine(this_thread) == get_coroutine(mainThread) ? 4 : 2; 592 } 593 590 594 extern "C" { 591 595 void __cfaabi_dbg_bits_acquire() { -
TabularUnified src/libcfa/concurrency/preemption.c ¶
r7d94d805 r2b8bc41 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jan 23 17:59:30201813 // Update Count : 712 // Last Modified On : Tue Feb 6 15:00:36 2018 13 // Update Count : 10 14 14 // 15 15 … … 42 42 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ); 43 43 void sigHandler_segv ( __CFA_SIGPARMS__ ); 44 void sigHandler_ill ( __CFA_SIGPARMS__ ); 45 void sigHandler_fpe ( __CFA_SIGPARMS__ ); 44 46 void sigHandler_abort ( __CFA_SIGPARMS__ ); 45 47 … … 243 245 244 246 // Setup proper signal handlers 245 __ kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler247 __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler 246 248 247 249 signal_block( SIGALRM ); -
TabularUnified src/libcfa/interpose.c ¶
r7d94d805 r2b8bc41 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 5 23:40:04201813 // Update Count : 1712 // Last Modified On : Tue Feb 6 17:57:56 2018 13 // Update Count : 49 14 14 // 15 15 … … 88 88 89 89 void sigHandler_segv ( __CFA_SIGPARMS__ ); 90 void sigHandler_ill ( __CFA_SIGPARMS__ ); 91 void sigHandler_fpe ( __CFA_SIGPARMS__ ); 90 92 void sigHandler_abort( __CFA_SIGPARMS__ ); 91 93 … … 98 100 INIT_REALRTN( exit, version ); 99 101 100 __kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler 101 __kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler 102 __kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler 102 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler 103 __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler 104 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO ); // Failure handler 105 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO ); // Failure handler 106 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler 103 107 } 104 108 } … … 118 122 } 119 123 120 void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 124 void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 125 va_list argp; 126 va_start( argp, fmt ); 121 127 abortf( fmt, argp ); 128 va_end( argp ); 122 129 } 123 130 124 131 void * kernel_abort ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; } 125 132 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {} 133 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return 4; } 126 134 127 135 enum { abort_text_size = 1024 }; 128 136 static char abort_text[ abort_text_size ]; 137 static int abort_lastframe; 129 138 130 139 extern "C" { 131 140 void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 132 void * kernel_data = kernel_abort(); 133 141 void * kernel_data = kernel_abort(); // must be done here to lock down kernel 134 142 int len; 143 144 abort_lastframe = kernel_abort_lastframe(); 145 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid) 146 __cfaabi_dbg_bits_write( abort_text, len ); 135 147 136 148 if ( fmt ) { … … 139 151 140 152 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 141 142 153 va_end( args ); 143 144 154 __cfaabi_dbg_bits_write( abort_text, len ); 145 //__cfaabi_dbg_bits_write( "\n", 1 ); 146 } 147 148 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld)\n", (long int)getpid() ); // use UNIX pid (versus getPid) 149 __cfaabi_dbg_bits_write( abort_text, len ); 150 155 156 if ( fmt[strlen( fmt ) - 1] != '\n' ) { // add optional newline if missing at the end of the format text 157 __cfaabi_dbg_bits_write( "\n", 1 ); 158 } 159 } 151 160 152 161 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 153 154 162 libc_abort(); 155 163 } 156 164 } 157 165 158 // skip first 6 stack frames by default 159 static void __kernel_backtrace(){160 // skip first Nstack frames161 int start = 6;162 163 enum { Frames = 50 }; 166 static void __cfaabi_backtrace() { 167 enum { 168 Frames = 50, // maximum number of stack frames 169 Start = 8, // skip first N stack frames 170 }; 171 164 172 void * array[Frames]; 165 173 size_t size = backtrace( array, Frames ); … … 170 178 __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]); 171 179 172 // skip last 2 stack frames after main 173 for ( int i = start; i < size && messages != NULL; i += 1 ) { 174 char * name = NULL; 175 char * offset_begin = NULL; 176 char * offset_end = NULL; 177 178 for ( char *p = messages[i]; *p; ++p ) { 180 for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) { 181 char * name = NULL, * offset_begin = NULL, * offset_end = NULL; 182 183 for ( char * p = messages[i]; *p; ++p ) { 179 184 //__cfaabi_dbg_bits_print_nolock( "X %s\n", p); 180 185 // find parantheses and +offset … … 192 197 193 198 // if line contains symbol print it 194 int frameNo = i - start;199 int frameNo = i - Start; 195 200 if ( name && offset_begin && offset_end && name < offset_begin ) { 196 201 // delimit strings … … 206 211 } 207 212 } 208 209 213 free( messages ); 210 214 } 211 215 212 216 void sigHandler_segv( __CFA_SIGPARMS__ ) { 213 // skip first only 1 stack frames in case of segfault. 214 abortf( "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." ); 217 abortf( "Attempt to address location %p\n" 218 "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n", 219 sfp->si_addr ); 220 } 221 222 void sigHandler_ill( __CFA_SIGPARMS__ ) { 223 abortf( "Attempt to execute code at location %p.\n" 224 "Possible cause is stack corruption.\n", 225 sfp->si_addr ); 226 } 227 228 void sigHandler_fpe( __CFA_SIGPARMS__ ) { 229 const char * msg; 230 231 switch ( sfp->si_code ) { 232 case FPE_INTDIV: 233 case FPE_FLTDIV: msg = "divide by zero"; break; 234 case FPE_FLTOVF: msg = "overflow"; break; 235 case FPE_FLTUND: msg = "underflow"; break; 236 case FPE_FLTRES: msg = "inexact result"; break; 237 case FPE_FLTINV: msg = "invalid operation"; break; 238 default: msg = "unknown"; 239 } // switch 240 abortf( "Floating point error.\n" 241 "Cause is %s.\n", msg ); 215 242 } 216 243 217 244 void sigHandler_abort( __CFA_SIGPARMS__ ) { 218 __ kernel_backtrace();245 __cfaabi_backtrace(); 219 246 220 247 // reset default signal handler 221 __ kernel_sigdefault( SIGABRT );248 __cfaabi_sigdefault( SIGABRT ); 222 249 223 250 raise( SIGABRT );
Note: See TracChangeset
for help on using the changeset viewer.