Subject: Re: [boost] Boost sprint: #3407 boost::call_once not re-entrant(atleast in win32)
From: Gottlob Frege (gottlobfrege_at_[hidden])
Date: 2009-11-23 11:43:59


On Mon, Nov 23, 2009 at 10:25 AM, Peter Dimov <pdimov_at_[hidden]> wrote:
> Gottlob Frege wrote:
>>
>> But then complete_once() would imply recursion also, so I decided to
>> separate the concepts.
>
> If you look at local statics for guidance [6.7/4 in N3000]:
>
> "If the initialization exits by throwing an exception, the initialization is
> not complete, so it will be tried again the next time control enters the
> declaration."
>
> "If control re-enters the declaration recursively while the object is being
> initialized, the behavior is undefined."

I agree, particularly for local statics. I was just experimenting,
and 'concurrently' there was an email here about it, so I tossed out
my experiment.

> No, it's the correct behavior. The function is not considered "called"
> unless it returns.
>

Unfortunately the function obviously was *called*. But I just think
this means "call_once" is a slightly inaccurate name. It doesn't mean
we should change the implementation. And "call_and_return_once" is a
bit much. :-)

Again, for me, it was just an experiment. The recursive check, in
particular, I considered probably only useful when debugging (my
version asserts in debug).

In general, call_once and static locals are something of a hobby of
mine, as sad as that is (ie I have no life). You might recall (as you
were in some of the discussions) usenet posts in the past from me
concerning:

void f()
{
   static_local<Foo> foo;
   ...
}

and

void f()
{
   static Once once;

   if (Once::Sentry sentry = once)
   {
      do_stuff_once();
      etc();
   }
    // or wait till done

    more_code();
}

Or not recall, as there's lots of posts out there!

Anyhow thanks for the opinions on exceptions and recursion. Confirmed
my expectations.
Tony