Actions
| Post | |
| Subscribe | |
| Unsubscribe |
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- To: David Abrahams <dave@xxxxxxxxxxxxxxxxxxxx>
- Subject: Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- From: Jason Merrill <jason@xxxxxxxxxx>
- Date: Tue, 14 Mar 2006 16:37:45 -0500
David Abrahams wrote:
"Meredith, Alisdair" <Alisdair.Meredith@xxxxxxxxxxxxxxxx> writes: In the model I'm proposing, cancellation will be expressed by telling the cancelled thread to throw a specific exception object at the next (or current) cancellation point reached with cancellation enabled. All exceptions are catchable. Exceptions can be unstoppable, if you write them in a particular way.
Hmm....
extern "C" int printf (const char *, ...);
struct E
{
bool undead;
E(): undead (true) { }
~E() { if (undead) throw E(); }
};
int main()
{
try
{
try
{
throw E();
}
catch (...)
{
printf ("caught once\n");
}
}
catch (E& e)
{
printf ("caught twice\n");
e.undead = false;
}
}
This works in g++, but EDG calls terminate() when the destructor throws.
I think g++ is correct; 15.5.1 doesn't mention throwing during
destruction of the exception object due to flowing off the end of the
handler as one of the situations that causes terminate() to be called,
and I don't see any reason why it would need to be.
We would still call terminate() if the catch(...) block exits by throwing another exception, since then the exception object is destroyed during stack unwinding.
ii/ if cancellation passes through an exception specification, we call unexpected and abort which pretty much achieves the same thingNo, it doesn't complete stack unwinding, and it might kill the whole process (I'm not sure about that).iii/ if cancellation interupts a dtor during regular stack unwinding, we call terminate which pretty much has the same effect,so everyone is still happy.Likewise.
In previous discussions everyone has agreed that cancellation should be disabled during stack unwinding, to avoid this situation. This could be implemented either by the EH runtime calling pthread_setcancelstate or by the cancellation runtime checking to see if it's safe to throw a la Alexander.
Jason
- Follow-Ups:
- Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- From: David Abrahams
- Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- References:
- RE: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- From: Meredith, Alisdair
- Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- From: David Abrahams
- RE: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- Prev by Date: Re: [c++-pthreads] Re: [SPAM] - Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost - Email found in subject
- Next by Date: Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- Previous by thread: Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- Next by thread: Re: [c++-pthreads] Re: FW: RE: Re: I'm Lost
- Index(es):