Module: wine Branch: master Commit: 0f8950d6464eaa8e8d17e7f8ab9df694a40b39ca URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f8950d6464eaa8e8d17e7f8ab...
Author: Michael Karcher wine@mkarcher.dialup.fu-berlin.de Date: Sat Oct 11 23:59:12 2008 +0200
msxml3: Use the _private element of xmlDoc as pointer.
---
dlls/msxml3/domdoc.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index c944623..77ad06f 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -81,6 +81,26 @@ typedef struct _domdoc DispatchEx dispex; } domdoc;
+typedef struct _xmldoc_priv { + LONG refs; +} xmldoc_priv; + +static inline xmldoc_priv * priv_from_xmlDocPtr(xmlDocPtr doc) +{ + return doc->_private; +} + +static xmldoc_priv * create_priv(void) +{ + xmldoc_priv *priv; + priv = HeapAlloc( GetProcessHeap(), 0, sizeof (*priv) ); + + if(priv) + priv->refs = 0; + + return priv; +} + static xmlDocPtr doparse( char *ptr, int len ) { #ifdef HAVE_XMLREADMEMORY @@ -97,18 +117,21 @@ static xmlDocPtr doparse( char *ptr, int len )
LONG xmldoc_add_ref(xmlDocPtr doc) { - LONG ref = InterlockedIncrement((LONG*)&doc->_private); + LONG ref = InterlockedIncrement(&priv_from_xmlDocPtr(doc)->refs); TRACE("%d\n", ref); return ref; }
LONG xmldoc_release(xmlDocPtr doc) { - LONG ref = InterlockedDecrement((LONG*)&doc->_private); + xmldoc_priv *priv = priv_from_xmlDocPtr(doc); + LONG ref = InterlockedDecrement(&priv->refs); TRACE("%d\n", ref); if(ref == 0) { TRACE("freeing docptr %p\n", doc); + HeapFree(GetProcessHeap(), 0, doc->_private); + xmlFreeDoc(doc); }
@@ -1194,7 +1217,7 @@ static HRESULT domdoc_onDataAvailable(void *obj, char *ptr, DWORD len)
xmldoc = doparse( ptr, len ); if(xmldoc) { - xmldoc->_private = 0; + xmldoc->_private = create_priv(); attach_xmlnode(This->node, (xmlNodePtr) xmldoc); }
@@ -1310,7 +1333,7 @@ static HRESULT WINAPI domdoc_load(
if(!filename || FAILED(hr)) { xmldoc = xmlNewDoc(NULL); - xmldoc->_private = 0; + xmldoc->_private = create_priv(); attach_xmlnode(This->node, (xmlNodePtr) xmldoc); hr = S_FALSE; } @@ -1442,7 +1465,7 @@ static HRESULT WINAPI domdoc_loadXML( if(!xmldoc) xmldoc = xmlNewDoc(NULL);
- xmldoc->_private = 0; + xmldoc->_private = create_priv(); attach_xmlnode( This->node, (xmlNodePtr) xmldoc );
return hr; @@ -2060,7 +2083,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) if(!xmldoc) return E_OUTOFMEMORY;
- xmldoc->_private = 0; + xmldoc->_private = create_priv();
hr = DOMDocument_create_from_xmldoc(xmldoc, (IXMLDOMDocument2**)ppObj); if(FAILED(hr))