Module: wine Branch: master Commit: d6ccaa43a63e700637a88913a8aca10381906414 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d6ccaa43a63e700637a88913a8...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Oct 14 12:07:27 2007 +0200
mshtml: Added ref counting to node object.
---
dlls/mshtml/htmlnode.c | 20 ++++++++++++++------ dlls/mshtml/mshtml_private.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 82e38c4..8eb907a 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -50,19 +50,26 @@ static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface, static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface) { HTMLDOMNode *This = HTMLDOMNODE_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p)\n", This); + TRACE("(%p) ref=%d\n", This, ref);
- return IHTMLDocument2_AddRef(HTMLDOC(This->doc)); + return ref; }
static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface) { HTMLDOMNode *This = HTMLDOMNODE_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p)\n", This); + TRACE("(%p) ref=%d\n", This, ref);
- return IHTMLDocument2_Release(HTMLDOC(This->doc)); + if(!ref) { + This->vtbl->destructor(This); + mshtml_free(This); + } + + return ref; }
static HRESULT WINAPI HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode *iface, UINT *pctinfo) @@ -352,6 +359,7 @@ static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode) }
ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl; + ret->ref = 1; ret->doc = doc;
nsIDOMNode_AddRef(nsnode); @@ -396,7 +404,7 @@ void release_nodes(HTMLDocument *This)
for(iter = This->nodes; iter; iter = next) { next = iter->next; - iter->vtbl->destructor(iter); - mshtml_free(iter); + iter->doc = NULL; + IHTMLDOMNode_Release(HTMLDOMNODE(iter)); } } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 4c63f60..a493109 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -270,6 +270,8 @@ struct HTMLDOMNode { const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl; const NodeImplVtbl *vtbl;
+ LONG ref; + nsIDOMNode *nsnode; HTMLDocument *doc;