[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