> On Sep 3, 2016, at 1:40 AM, Thiago Macieira <thi...@kde.org> wrote: > Hello > > Summary: abi::__foced_unwind is available when #include <cxxabi.h> from GCC > (libsupc++), but is not documented in > https://mentorembedded.github.io/cxx-abi/abi-eh.html nor is it available in > other implementations. Should it be > adde to the spec so we can detect forced unwinds? Or is there another way to > detect the forced unwinding not caused by an exception? > > Background: > > 30.3.1.2 [thread.thread.constr] p5 says > > " If the invocation of INVOKE (DECAY_COPY ( std::forward<F>(f)), DECAY_COPY > (std::forward<Args>(args))...) terminates with an uncaught exception, > std::terminate shall be called." > > When trying to implement this requirement for QThread, we've run into a snag: > with glibc's pthread implementation on Linux, pthread_exit() as well as all > POSIX asynchronous cancellations happen by way of a forced stack unwinding. > This means the obvious solution to implement the requirement from the > standard > fails: > > try { > thr->run(); > } catch (...) { > std::terminate(); > } > > That catch (...) block is run by the forced stack unwinding started with > _Unwind_ForcedUnwind. Since it then calls std::terminate(), the whole > application terminates instead of just the thread. > > Now, the libstdc++ implementation[1][2] handles this gracefully, but does so > by catching abi::__forced_unwind. > > That brings me to my original question in the subject: how can code outside > of > the compiler's own implementations detect a forced stack unwinding not caused > by a thrown exception in a portable fashion? > > Option 1: make abi::__forced_unwind documented and have the other > implementations (besides GCC) implement it too.
This would be inappropriate; the appropriate solution would be to ask the committee for a new function in namespace std that could be implemented with abi::__forced_unwind. I believe that's the chief purpose of that function, to allow that sort of functionality to be implemented in the future. If std::current_exception works, of course, all the better. John. > > Option 2: add a getter to either the Base ABI for unwinding (_Unwind_*) or > the > C++ ABI to get a flag indicating whether the unwind is forced. In fact, this > information is already available in the actions parameter to the personality > routine: > https://mentorembedded.github.io/cxx-abi/abi-eh.html#base-personality > has: > static const _Unwind_Action _UA_FORCE_UNWIND = 8; > > Option 3: change the way that GCC and glibc force unwinding from non-C++ > contexts. > > [1] https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B > %2B11/thread.cc#L77 > [2] I don't see any code in libc++ for handling exceptions at all. > > -- > Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org > Software Architect - Intel Open Source Technology Center > > _______________________________________________ > cxx-abi-dev mailing list > cxx-abi-dev@codesourcery.com > http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev _______________________________________________ cxx-abi-dev mailing list cxx-abi-dev@codesourcery.com http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev