Changeset dbe9b08 for src/libcfa/concurrency/preemption.c
- Timestamp:
- Jan 25, 2018, 5:02:09 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:
- 91496f3
- Parents:
- 6e0f4bd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/preemption.c
r6e0f4bd rdbe9b08 19 19 extern "C" { 20 20 #include <errno.h> 21 #include <execinfo.h>22 #define __USE_GNU23 #include <signal.h>24 #undef __USE_GNU25 21 #include <stdio.h> 26 22 #include <string.h> … … 29 25 #undef ftype 30 26 31 #ifdef __USE_STREAM__ 32 #include "fstream" 33 #endif 27 #include "bits/signal.h" 34 28 35 29 //TODO move to defaults … … 40 34 return __CFA_DEFAULT_PREEMPTION__; 41 35 } 42 43 // Short hands for signal context information44 #define __CFA_SIGCXT__ ucontext_t *45 #define __CFA_SIGPARMS__ __attribute__((unused)) int sig, __attribute__((unused)) siginfo_t *sfp, __attribute__((unused)) __CFA_SIGCXT__ cxt46 36 47 37 // FwdDeclarations : timeout handlers … … 53 43 void sigHandler_segv ( __CFA_SIGPARMS__ ); 54 44 void sigHandler_abort ( __CFA_SIGPARMS__ ); 55 56 // FwdDeclarations : sigaction wrapper57 static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags );58 45 59 46 // FwdDeclarations : alarm thread main … … 246 233 // Setup proper signal handlers 247 234 __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler 248 // __kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler249 // __kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler250 235 251 236 signal_block( SIGALRM ); … … 380 365 } 381 366 382 // Sigaction wrapper : register an signal handler383 static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {384 struct sigaction act;385 386 act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;387 act.sa_flags = flags;388 389 if ( sigaction( sig, &act, NULL ) == -1 ) {390 __cfaabi_dbg_print_buffer_decl(391 " __kernel_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",392 sig, handler, flags, errno, strerror( errno )393 );394 _exit( EXIT_FAILURE );395 }396 }397 398 // Sigaction wrapper : restore default handler399 static void __kernel_sigdefault( int sig ) {400 struct sigaction act;401 402 act.sa_handler = SIG_DFL;403 act.sa_flags = 0;404 sigemptyset( &act.sa_mask );405 406 if ( sigaction( sig, &act, NULL ) == -1 ) {407 __cfaabi_dbg_print_buffer_decl(408 " __kernel_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",409 sig, errno, strerror( errno )410 );411 _exit( EXIT_FAILURE );412 }413 }414 415 //=============================================================================================416 // Terminating Signals logic417 //=============================================================================================418 419 __cfaabi_dbg_debug_do(420 static void __kernel_backtrace( int start ) {421 // skip first N stack frames422 423 enum { Frames = 50 };424 void * array[Frames];425 int size = backtrace( array, Frames );426 char ** messages = backtrace_symbols( array, size );427 428 // find executable name429 *index( messages[0], '(' ) = '\0';430 #ifdef __USE_STREAM__431 serr | "Stack back trace for:" | messages[0] | endl;432 #else433 fprintf( stderr, "Stack back trace for: %s\n", messages[0]);434 #endif435 436 // skip last 2 stack frames after main437 for ( int i = start; i < size && messages != NULL; i += 1 ) {438 char * name = NULL;439 char * offset_begin = NULL;440 char * offset_end = NULL;441 442 for ( char *p = messages[i]; *p; ++p ) {443 // find parantheses and +offset444 if ( *p == '(' ) {445 name = p;446 }447 else if ( *p == '+' ) {448 offset_begin = p;449 }450 else if ( *p == ')' ) {451 offset_end = p;452 break;453 }454 }455 456 // if line contains symbol print it457 int frameNo = i - start;458 if ( name && offset_begin && offset_end && name < offset_begin ) {459 // delimit strings460 *name++ = '\0';461 *offset_begin++ = '\0';462 *offset_end++ = '\0';463 464 #ifdef __USE_STREAM__465 serr | "(" | frameNo | ")" | messages[i] | ":"466 | name | "+" | offset_begin | offset_end | endl;467 #else468 fprintf( stderr, "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);469 #endif470 }471 // otherwise, print the whole line472 else {473 #ifdef __USE_STREAM__474 serr | "(" | frameNo | ")" | messages[i] | endl;475 #else476 fprintf( stderr, "(%i) %s\n", frameNo, messages[i] );477 #endif478 }479 }480 481 free( messages );482 }483 )484 485 // void sigHandler_segv( __CFA_SIGPARMS__ ) {486 // __cfaabi_dbg_debug_do(487 // #ifdef __USE_STREAM__488 // serr | "*CFA runtime error* program cfa-cpp terminated with"489 // | (sig == SIGSEGV ? "segment fault." : "bus error.")490 // | endl;491 // #else492 // fprintf( stderr, "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." );493 // #endif494 495 // // skip first 2 stack frames496 // __kernel_backtrace( 1 );497 // )498 // exit( EXIT_FAILURE );499 // }500 501 // void sigHandler_abort( __CFA_SIGPARMS__ ) {502 // // skip first 6 stack frames503 // __cfaabi_dbg_debug_do( __kernel_backtrace( 6 ); )504 505 // // reset default signal handler506 // __kernel_sigdefault( SIGABRT );507 508 // raise( SIGABRT );509 // }510 511 367 // Local Variables: // 512 368 // mode: c //
Note: See TracChangeset
for help on using the changeset viewer.