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!