From d6ccaa43a63e700637a88913a8aca10381906414 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sun, 14 Oct 2007 12:07:27 +0200 Subject: [PATCH] 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 82e38c44303..8eb907a2fb9 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 4c63f60e046..a493109854b 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;