Changes in libcfa/src/exception.c [979df46:8ad5752]
- File:
-
- 1 edited
-
libcfa/src/exception.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/exception.c
r979df46 r8ad5752 10 10 // Created On : Mon Jun 26 15:13:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : T ue Apr 14 12:01:00 202013 // Update Count : 1812 // Last Modified On : Thr May 21 12:18:00 2020 13 // Update Count : 20 14 14 // 15 15 … … 80 80 } 81 81 82 void __cfaehm_throw_resume(exception_t * except ) {82 void __cfaehm_throw_resume(exception_t * except, void (*defaultHandler)(exception_t *)) { 83 83 struct exception_context_t * context = this_exception_context(); 84 84 … … 96 96 } 97 97 98 // No handler found, fall back to the default operation. 98 99 __cfadbg_print_safe(exception, "Unhandled exception\n"); 99 100 // Fall back to termination: 101 __cfaehm_throw_terminate(except); 102 // TODO: Default handler for resumption. 100 defaultHandler(except); 103 101 } 104 102 … … 239 237 } 240 238 239 static void __cfaehm_cleanup_default( exception_t ** except ) { 240 __cfaehm_delete_exception( *except ); 241 *except = NULL; 242 } 243 241 244 // The exception that is being thrown must already be stored. 242 static __attribute__((noreturn)) void __cfaehm_begin_unwind(void) { 243 if ( ! this_exception_context()->current_exception ) { 245 static void __cfaehm_begin_unwind(void(*defaultHandler)(exception_t *)) { 246 struct exception_context_t * context = this_exception_context(); 247 struct _Unwind_Exception * storage = &this_exception_storage; 248 if ( NULL == context->current_exception ) { 244 249 printf("UNWIND ERROR missing exception in begin unwind\n"); 245 250 abort(); … … 247 252 248 253 // Call stdlibc to raise the exception 249 _Unwind_Reason_Code ret = _Unwind_RaiseException( &this_exception_storage ); 254 __cfadbg_print_safe(exception, "Begin unwinding (storage &p, context %p)\n", storage, context); 255 _Unwind_Reason_Code ret = _Unwind_RaiseException( storage ); 250 256 251 257 // If we reach here it means something happened. For resumption to work we need to find a way … … 256 262 // the whole stack. 257 263 264 // We did not simply reach the end of the stack without finding a handler. This is an error. 265 if ( ret != _URC_END_OF_STACK ) { 266 printf("UNWIND ERROR %d after raise exception\n", ret); 267 abort(); 268 } 269 258 270 // No handler found, go to the default operation. 259 // Currently this will always be a cancellation. 260 if ( ret == _URC_END_OF_STACK ) { 261 __cfadbg_print_safe(exception, "Uncaught exception %p\n", &this_exception_storage); 262 263 __cfaehm_cancel_stack(this_exception_context()->current_exception); 264 } 265 266 // We did not simply reach the end of the stack without finding a handler. This is an error. 267 printf("UNWIND ERROR %d after raise exception\n", ret); 271 __cfadbg_print_safe(exception, "Uncaught exception %p\n", storage); 272 273 __attribute__((cleanup(__cfaehm_cleanup_default))) 274 exception_t * exception = context->current_exception; 275 defaultHandler( exception ); 276 } 277 278 void __cfaehm_throw_terminate( exception_t * val, void (*defaultHandler)(exception_t *) ) { 279 __cfadbg_print_safe(exception, "Throwing termination exception\n"); 280 281 __cfaehm_allocate_exception( val ); 282 __cfaehm_begin_unwind( defaultHandler ); 283 } 284 285 static __attribute__((noreturn)) void __cfaehm_rethrow_adapter( exception_t * except ) { 286 // TODO: Print some error message. 287 (void)except; 268 288 abort(); 269 }270 271 void __cfaehm_throw_terminate( exception_t * val ) {272 __cfadbg_print_safe(exception, "Throwing termination exception\n");273 274 __cfaehm_allocate_exception( val );275 __cfaehm_begin_unwind();276 289 } 277 290 … … 279 292 __cfadbg_print_safe(exception, "Rethrowing termination exception\n"); 280 293 281 __cfaehm_begin_unwind(); 294 __cfaehm_begin_unwind( __cfaehm_rethrow_adapter ); 295 abort(); 282 296 } 283 297
Note:
See TracChangeset
for help on using the changeset viewer.