Re: Compiling C++ modules

Denis Vlasenko
2006-04-27T15:10:20Z

On Tuesday 25 April 2006 20:53, Avi Kivity wrote:
> Very often one needs to acquire a resource, do something with it, and
> then free the resource. Here, "resource" can mean a file descriptor, a
> reference into a reference counted object, or, in our case, a spinlock.
> And we want "free" to mean "free no matter what", e.g. on a normal path
> or an exception path.

...

> Additionally, C++ guarantees that if an exception is thrown after
> spin_lock() is called, then the spin_unlock() will also be called.
> That's an interesting mechanism by itself.

Life gets even more interesting when you hit another exception
inside destructor(s) being executed due to first one.
Say, spin_unlock() discovers that lock is already unlocked
and does "throw BUG_double_unlock".

Even if you
(a) remember what standard says about it
(b) implemented nested exception handling correctly,
then you are still left with
(c) let's pray gcc has no bugs in stack unwinding
and nested exceptions and nested destructor calls.

Mozilla crashes over such things. For Mozilla, crash is not
*that* catastrophic. For OS kernel, it is.
--
vda