On Tue, Jul 5, 2011 at 8:11 PM, Adam Martinson amartinson@codeweavers.com wrote:
dlls/msxml3/nodelist.c | 33 ++++++++++++++++++++++++++++++++- dlls/msxml3/selection.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-)
+ else if ( IsEqualGUID( riid, &IID_IEnumVARIANT ) ) + { + if (!This->enumv && + (This->enumv = create_nodelist_enum(&This->IXMLDOMNodeList_iface))) + IXMLDOMNodeList_Release(iface); /* create_nodelist_enum() adds a ref, and we don't here. */ + + if (!This->enumv) + { + *ppvObject = NULL; + return E_OUTOFMEMORY; + } + + IEnumVARIANT_AddRef(This->enumv); + *ppvObject = This->enumv; + return S_OK; + }
Shouldn't this->enumv be protected somehow to work with multiple threads? I know that so called FreeThreaded* thing is only reported to be supported, but still. Maybe something like pointer exchange call will work.
On 07/05/2011 11:23 AM, Nikolay Sivov wrote:
On Tue, Jul 5, 2011 at 8:11 PM, Adam Martinson amartinson@codeweavers.com wrote:
dlls/msxml3/nodelist.c | 33 ++++++++++++++++++++++++++++++++- dlls/msxml3/selection.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-)
- else if ( IsEqualGUID( riid,&IID_IEnumVARIANT ) )
- {
if (!This->enumv&&
(This->enumv = create_nodelist_enum(&This->IXMLDOMNodeList_iface)))
IXMLDOMNodeList_Release(iface); /*
create_nodelist_enum() adds a ref, and we don't here. */
if (!This->enumv)
{
*ppvObject = NULL;
return E_OUTOFMEMORY;
}
IEnumVARIANT_AddRef(This->enumv);
*ppvObject = This->enumv;
return S_OK;
- }
Shouldn't this->enumv be protected somehow to work with multiple threads? I know that so called FreeThreaded* thing is only reported to be supported, but still. Maybe something like pointer exchange call will work.
I like that idea, thanks!