__attribute__((cleanup(function)) versus try/finally
Mark Mitchell
mark@codesourcery.com
Thu May 8 18:40:00 GMT 2003
On Thu, 2003-05-08 at 10:44, Jason Merrill wrote:
> On Thu, 8 May 2003 10:44:04 -0700, Mike Stump <mrs@apple.com> wrote:
>
> > On Tuesday, May 6, 2003, at 02:02 PM, Jason Merrill wrote:
> >> Hmm, I suppose you can assume that $sp is linear.
> >
> > One can track discontinuities in an along side data structure at the
> > discontinuity creation points, and use that to order the comparisons during
> > throw time, should we want to.
>
> Again, this sort of thing sounds like a cure that's worse than the disease.
I think our value-functions are not the same.
If we were designing a new language, I'd certainly agree with you that
exceptions are a good feature. When discussing C on a workstation-class
machine, I'd be more likely to agree with you, even though I think
adding exceptions to C is antithetical of that language's key design
goals.
When discussing C for embedded systems, though, I just can't see it. I
fully concede that my scheme is less beautiful -- unless you see beauty
in the number of bytes saved.
I think what really happened here was that the pthreads designers wanted
to add pthread_atexit -- and then got carried away.
(In fact, so far as I can tell, a careful reading of
http://www.unix.org/single_unix_specification/
would suggest that:
pthread_cleanup_push (f, a);
goto l;
pthread_cleanup_pop (1);
l:
is well-defined, and does not result in the cleanup being executed.
Presumably, this should be undefined behavior, as it does not work at
all with the sample implementation in the specification.
The question of whether pthread_cleanup_push should create a new scope
is also important, at least in C99 and C++: is
int i;
pthread_cleanup_push (f, a);
int i;
valid, or not, or is this unspecified?)
Also, doesn't the execute argument to pthread_cleanup_pop mean that
try/finally isn't the right construct?
I would think that the EH version of:
pthread_cleanup_push (f, a);
g ();
pthread_cleanup_pop (x);
would be:
try {
g();
} catch (...) {
f(a);
throw;
}
if (x) f(a);
--
Mark Mitchell <mark@codesourcery.com>
CodeSourcery, LLC
More information about the Gcc
mailing list