[OLE #21] Make apartment access thread safe, rework OLE TLS management (take 2)

Robert Shearman rob at codeweavers.com
Tue Jan 4 16:35:15 CST 2005


Mike Hearn wrote:

>On Tue, 2005-01-04 at 15:27 -0600, Robert Shearman wrote:
>  
>
>>Because inits should be thread-local, not apartment scoped. 
>>NtCurrentTeb()->ReservedForOle should be set to NULL when the matching
>>CoUninitialize is called, not when the apartment is destroyed.
>>    
>>
>
>I was under the impression that CoSetState/*ErrorInfo weren't tied to
>apartments at all, hence the whole uninitialised apartments thing. So
>it's not right to set ReservedForOle to NULL when CoUninitialise is
>called with this patch because ReservedForOle now points to a struct
>oletls not an apartment (which should be refcounted so CoUninitialise in
>the MTA doesn't trigger its destruction).
>  
>

You are right. My tests show that the TLS state struct isn't be freed 
when the final CoUninitialize is called. However, it should still detach 
from the apartment. I believe we should do something like this in 
CoUninitialize:

if (!--COM_CurrentInfo()->inits)
{
    COM_ApartmentRelease(COM_CurrentInfo()->apt);
    COM_CurrentInfo()->apt = NULL;
}

and obviously increment COM_CurrentInfo()->inits in CoInitializeEx. And 
we should only add a reference to the apartment once in CoInitializeEx.

>That does leave the question of how to free the OLE TLS data though.
>Presumably in a THREAD_DETACH notification.
>  
>

That sounds like the best plan, otherwise we will leak a small amount of 
memory for each thread that uses COM functions.

Rob



More information about the wine-devel mailing list