_Unwind_Reason_Code __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e, void * handler, void * argument) { return _Unwind_ForcedUnwind (e, handler, argument); }
static void thread_unwind(void) { struct pthread *curthread = _get_curthread(); curthread->ex.exception_class = 0; curthread->ex.exception_cleanup = thread_unwind_cleanup; _Unwind_ForcedUnwind(&curthread->ex, thread_unwind_stop, NULL); PANIC("_Unwind_ForcedUnwind returned"); }
static void force_unwind () { struct _Unwind_Exception *exc = malloc (sizeof (*exc)); memset (&exc->exception_class, 0, sizeof (exc->exception_class)); exc->exception_cleanup = 0; _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); abort (); }
static void force_unwind (void) { struct _Unwind_Exception *exc = malloc (sizeof (*exc)); memset (&exc->exception_class, 0, sizeof (exc->exception_class)); exc->exception_cleanup = 0; #ifndef __USING_SJLJ_EXCEPTIONS__ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); #else _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); #endif abort (); }
force_unwind () { _Unwind_Exception *exc = new _Unwind_Exception; // exception_class might not be a scalar. memset (&exc->exception_class, 0, sizeof (exc->exception_class)); exc->exception_cleanup = 0; #ifndef __USING_SJLJ_EXCEPTIONS__ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); #else _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); #endif abort (); }
static void force_unwind () { _Unwind_Exception *exc = new _Unwind_Exception; exc->exception_class = 0; exc->exception_cleanup = force_unwind_cleanup; #ifndef __USING_SJLJ_EXCEPTIONS__ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); #else _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); #endif abort (); }
weak_function #endif __pthread_unwind (__pthread_unwind_buf_t *buf) { struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; struct pthread *self = THREAD_SELF; #ifdef HAVE_FORCED_UNWIND /* This is not a catchable exception, so don't provide any details about the exception type. We do need to initialize the field though. */ THREAD_SETMEM (self, exc.exception_class, 0); THREAD_SETMEM (self, exc.exception_cleanup, unwind_cleanup); _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf); #else /* Handle the compatibility stuff first. Execute all handlers registered with the old method. We don't execute them in order, instead, they will run first. */ struct _pthread_cleanup_buffer *oldp = ibuf->priv.data.cleanup; struct _pthread_cleanup_buffer *curp = THREAD_GETMEM (self, cleanup); if (curp != oldp) { do { /* Pointer to the next element. */ struct _pthread_cleanup_buffer *nextp = curp->__prev; /* Call the handler. */ curp->__routine (curp->__arg); /* To the next. */ curp = nextp; } while (curp != oldp); /* Mark the current element as handled. */ THREAD_SETMEM (self, cleanup, curp); } /* We simply jump to the registered setjmp buffer. */ __libc_unwind_longjmp ((struct __jmp_buf_tag *) ibuf->cancel_jmp_buf, 1); #endif /* NOTREACHED */ /* We better do not get here. */ abort (); }
__pthread_unwind (__pthread_unwind_buf_t *buf) { struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; struct pthread *self = THREAD_SELF; /* This is not a catchable exception, so don't provide any details about the exception type. We do need to initialize the field though. */ THREAD_SETMEM (self, exc.exception_class, 0); THREAD_SETMEM (self, exc.exception_cleanup, &unwind_cleanup); _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf); /* NOTREACHED */ /* We better do not get here. */ abort (); }