[c++-pthreads] Re: FW: RE: Re: I'm Lost
Jason Merrill
jason at redhat.com
Tue Mar 14 21:37:45 UTC 2006
David Abrahams wrote:
> "Meredith, Alisdair" <Alisdair.Meredith at uk.renaultf1.com> 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 thing
>
> No, 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
More information about the c++-pthreads
mailing list