Hi Adrian, 

There are two things here, one is the signature of the function, 
and one is the actual parameter values.

I can imagine something about the different compiler versions
being more or less picky about signatures which types can and cannot be
converted to each other, but I find it hard to believe  that
Microsoft changed the actual system call.  According to the 
documentation parameter 2 and 3 need to be the values to be 
compared and exchanged, but instead of these values, _pointers_ 
to these values are passed.

As far as I can see, the current function passes two pointers instead
of a '1' and a '0' for exchange and comparand.  The result is that
g_uModuleInitializing is never equal to the comparand, so it is never
actually set to any other value then 0. The function will return the 
initial 0,  so it will continue thinking it has the lock, but without
actually setting the flag.  

I guess, the chance of multiple threads actually trying to initialize at

the same time, is pretty low, so it will seem to work, but it does not 
provide any protection this way.

> This appears to be a problem between different versions of MS VC++.
> 
> I applied this fix, as provided in
> http://issues.apache.org/jira/browse/AXISCPP-557.

Ehh, the patch you refer to in this issue shows the following code:

+ static void start_initializing()
+ {
+     while (InterlockedCompareExchange(&g_uModuleInitializing, 1, 0));
+ }

However the version in CVS has:

static void start_initializing()
{
    long exchange  = 1;
    long comperand = 0;
    while (InterlockedCompareExchange(((void **)&g_uModuleInitializing),
void*)&exchange, (void *) &comperand)));
}

Apart from the void * casts, the first one passes the values 1 and 0,
and the
second one passes the address of 2 variables that contain 1 and zero.  
The version in CVS definately does not match de documentation from
Microsoft.

I currently don't have VC6.0 installed to check out, what the problem
is. But my 
guess is that the version in the original patch is correct.
(I used the original version on VC7.1 and it compiles)

Do you remember what problems VC6.0 had with the original version?


Kind regards,



Rob.


 

Reply via email to