This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: catch(...) and forced unwind
- From: Mark Mitchell <mark at codesourcery dot com>
- To: Jamie Lokier <jamie at shareable dot org>
- Cc: Matt Austern <austern at apple dot com>, David Abrahams <dave at boost-consulting dot com>, Jason Merrill <jason at redhat dot com>, Ulrich Drepper <drepper at redhat dot com>, gcc at gcc dot gnu dot org, Richard Henderson <rth at redhat dot com>, Nathan Myers <ncm at cantrip dot org>, Jakub Jelinek <jakub at redhat dot com>, wekempf at cox dot net, fjh at cs dot mu dot oz dot au, Benjamin Kosnik <bkoz at redhat dot com>, William Kempf <williamkempf at hotmail dot com>
- Date: 18 Dec 2003 08:49:04 -0800
- Subject: Re: catch(...) and forced unwind
- Organization: CodeSourcery, LLC
- References: <xypwu91ofvf.fsf@miranda.boston.redhat.com> <ud6at1wvg.fsf@boost-consulting.com> <xypekv9nr9u.fsf@miranda.boston.redhat.com> <u65gkyhv4.fsf@boost-consulting.com> <20031214035909.GE2416@tofu.dreamhost.com> <xypk74xltaa.fsf@miranda.boston.redhat.com> <ullpdlksl.fsf@boost-consulting.com> <xyp1xr5lh5q.fsf@miranda.boston.redhat.com> <usmjlhryu.fsf@boost-consulting.com> <278A5A0A-3001-11D8-8564-00039390D9E0@apple.com> <20031218133852.GA16315@mail.shareable.org>
On Thu, 2003-12-18 at 05:38, Jamie Lokier wrote:
> Matt Austern wrote:
> > Note that it's possible to temporarily disable thread cancellation in
> > critical regions of code. It might be appropriate for glibc and/or
> > libstdc++ to do that. On the other hand, we'll have to think carefully
> > about standard conformance if we do something like that.
>
> Why not make C++ "throw()" functions automatically disable thread
> cancellation when they are entered and restore the state when they exit?
That's a special case.
You'd also want to do the disabling inside "throw (int)" functions for
example. And, then, you'd want to reenable if a "throw (int)" function
called a "throw (...)" function (perhaps inside a try-block).
I think that if you did all that, your idea would not violate either
standard. However, it still wouldn't really solve the problem. For
example:
// This function has no exception-specification but I know
// it only throws ints!
inline void f() { printf ("Throwing now!"); throw 3; }
// This function will never throw anything.
void g() throw () { try { f(); } catch (int) { } }
is the sort of C++ code that could be validated in a non-threaded
environment, but would call "std::terminate" if "printf" were
cancelled. (Unless other changes were made to C++ to special-case the
thread cancellation exception, which is the idea that I oppose.)
--
Mark Mitchell <mark@codesourcery.com>
CodeSourcery, LLC