Correction to COINIT_MULTITHREADED test

Christian Costa titan.costa at wanadoo.fr
Tue Jan 11 17:51:59 CST 2005


Paul Vriens wrote:

>On Tue, 2005-01-11 at 12:19, Christian Costa wrote:
>
>  
>
>>All the time ?
>>Looking at COM_CreateApartment it seems COINIT_APARTMENTTHREADED works but indeed COINIT_MULTITHREADED always return NULL.
>>I think the code at the beginning of COM_CreateApartment is wrong.
>>
>>            TRACE("thread 0x%lx is entering the multithreaded apartment\n", GetCurrentThreadId());
>>            COM_CurrentInfo()->apt = &MTA;
>>            return apt;
>>
>>I think we should return COM_CurrentInfo()->apt rather than apt.
>>
>>Bye,
>>Christian
>>
>>    
>>
>Just another thing.
>
>shouldn't s_COMLockCount be a per thread thing? Currently it's global.
>
No. This applies to the whole process.

>
>What I personally find strange is the behavior of InterlockedExchangeAdd
>especially with respect to the comments in compobj.c:
>
>  /*
>   * Check the lock count. If this is the first time going through the
>initialize
>   * process, we have to initialize the libraries.
>   *
>   * And crank-up that lock count.
>   */
>  lCOMRefCnt = InterlockedExchangeAdd(&s_COMLockCount,1);
>  TRACE("s_COMLockCount is now: %08lx\n", lCOMRefCnt);
>
>  if (lCOMRefCnt==0)
>
>and
>
>  /*
>   * Decrease the reference count.
>   * If we are back to 0 locks on the COM library, make sure we free
>   * all the associated data structures.
>   */
>  lCOMRefCnt = InterlockedExchangeAdd(&s_COMLockCount,-1);
>  TRACE("s_COMLockCount is now: %08lx\n", lCOMRefCnt);
>  if (lCOMRefCnt==1)
>  {
>
>
>The TRACE is something I added. 
>
>The comments say 'If this is the first time' and the check is for '==0'
>and 'If we are back to 0' but the check is for '==1'. A bit confusing.
>
>  
>
InterlockedExchangeAdd returns the value before (and not after like 
InterlockedIncrement) the value is added.
You've done too much InterlockedIncrement stuff. You should do a small 
break. ;-)
Maybe InterlockedIncrement should have been used here instead.

Bye,
Christian






More information about the wine-devel mailing list