apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sander Striker" <stri...@apache.org>
Subject RE: cvs commit: apr/threadproc/win32 thread.c
Date Sat, 01 Sep 2001 16:54:52 GMT
> On Sat, 1 Sep 2001 11:18:47 +0200
>  "Sander Striker" <striker@apache.org> wrote:
> > > rbb         01/09/01 00:29:07
> > >    APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t
> > *control,
> > >                                              void (*func)(void))
> > >    {
> > >   +    /* Quick escape hatch, and bug fix.
> >
> > This still isn't correct.  Now we have a race condition that
> > could result in the function never being called instead of once.
> > This looks better IMHO:
> >
> >         if (!InterlockedExchange(&control->value, 1))
> >             func();
> >
> >         return APR_SUCCESS;
>
> To also include the quick escape hatch:
>
> /* Save the system call if InterlockedExchange can't possibly return 0.
> The InterlockedExchange function returns the *old* value of the
> variable.  If it is 0, this is the first function to make it 1, and
> so the function should be called. */
> if ((0 == control->value) && (0 == InterlockedExchange(&control->value,
> 1)))
>     func();
>
> return APR_SUCCESS;
>
> BTW, I looked at doing this with InterlockedIncrement, since it returns
> the new value, except that Win95 is broken, and it just returns non-zero
> on success, not necessarily the new value.

Check out:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/hh/
winbase/synchro_1k38.asp

W95, NT3.51 and earlier do not neccesarily return the old value. Details,
details... :)

Sander


Mime
View raw message