From 805473190561d60f06e3b5d63cc30029137cf593 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Wed, 28 Mar 2012 19:33:33 +0000 Subject: Promote ref/unref in dom_node to be inlines. svn path=/trunk/libdom/; revision=13761 --- src/core/attr.h | 1 + src/core/characterdata.h | 1 + src/core/document.c | 4 ++-- src/core/document.h | 1 + src/core/document_type.h | 1 + src/core/element.h | 1 + src/core/node.c | 48 +++++++----------------------------------------- src/core/node.h | 8 +++----- 8 files changed, 17 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/core/attr.h b/src/core/attr.h index 2558f65..ce40c29 100644 --- a/src/core/attr.h +++ b/src/core/attr.h @@ -62,6 +62,7 @@ dom_exception _dom_attr_is_default_namespace(dom_node_internal *node, dom_exception _dom_attr_lookup_namespace(dom_node_internal *node, dom_string *prefix, dom_string **result); #define DOM_NODE_VTABLE_ATTR \ + _dom_node_try_destroy, \ _dom_node_get_node_name, \ _dom_attr_get_node_value, /*overload*/\ _dom_node_set_node_value, \ diff --git a/src/core/characterdata.h b/src/core/characterdata.h index cd1be0a..23be9c9 100644 --- a/src/core/characterdata.h +++ b/src/core/characterdata.h @@ -65,6 +65,7 @@ dom_exception _dom_characterdata_set_text_content( _dom_characterdata_replace_data #define DOM_NODE_VTABLE_CHARACTERDATA \ + _dom_node_try_destroy, \ _dom_node_get_node_name, \ _dom_node_get_node_value, \ _dom_node_set_node_value, \ diff --git a/src/core/document.c b/src/core/document.c index 723d4f8..5a286fc 100644 --- a/src/core/document.c +++ b/src/core/document.c @@ -1345,7 +1345,7 @@ dom_exception dom_document_dup_node(dom_document *doc, dom_node *node, } /** - * Try to destory the document. + * Try to destroy the document. * * \param doc The instance of Document * @@ -1357,7 +1357,7 @@ dom_exception dom_document_dup_node(dom_document *doc, dom_node *node, */ void _dom_document_try_destroy(dom_document *doc) { - if (doc->base.refcnt != 0 || doc->base.parent != NULL) + if (doc->base.base.refcnt != 0 || doc->base.parent != NULL) return; _dom_document_destroy((dom_node_internal *) doc); diff --git a/src/core/document.h b/src/core/document.h index d8e6945..a2b1801 100644 --- a/src/core/document.h +++ b/src/core/document.h @@ -190,6 +190,7 @@ dom_exception _dom_document_set_text_content(dom_node_internal *node, /* End of vtable */ #define DOM_NODE_VTABLE_DOCUMENT \ + _dom_node_try_destroy, \ _dom_node_get_node_name, \ _dom_node_get_node_value, \ _dom_node_set_node_value, \ diff --git a/src/core/document_type.h b/src/core/document_type.h index bccc469..2426b30 100644 --- a/src/core/document_type.h +++ b/src/core/document_type.h @@ -57,6 +57,7 @@ dom_exception _dom_document_type_set_text_content(dom_node_internal *node, _dom_document_type_get_internal_subset #define DOM_NODE_VTABLE_DOCUMENT_TYPE \ + _dom_node_try_destroy, \ _dom_node_get_node_name, \ _dom_node_get_node_value, \ _dom_node_set_node_value, \ diff --git a/src/core/element.h b/src/core/element.h index 9092a48..5873396 100644 --- a/src/core/element.h +++ b/src/core/element.h @@ -145,6 +145,7 @@ dom_exception _dom_element_is_default_namespace(dom_node_internal *node, dom_exception _dom_element_lookup_namespace(dom_node_internal *node, dom_string *prefix, dom_string **result); #define DOM_NODE_VTABLE_ELEMENT \ + _dom_node_try_destroy, \ _dom_node_get_node_name, \ _dom_node_get_node_value, \ _dom_node_set_node_value, \ diff --git a/src/core/node.c b/src/core/node.c index 4509f10..628c7c6 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -198,7 +198,7 @@ dom_exception _dom_node_initialise(dom_node_internal *node, node->user_data = NULL; - node->refcnt = 1; + node->base.refcnt = 1; list_init(&node->pending_list); if (node->type != DOM_DOCUMENT_NODE) { @@ -279,47 +279,11 @@ void _dom_node_finalise(dom_node_internal *node) } } -/** - * Claim a reference on a DOM node - * - * \param node The node to claim a reference on - */ -struct dom_node *_dom_node_ref(dom_node_internal *node) -{ - if (node != NULL) - node->refcnt++; - - return (struct dom_node *)node; -} - /* ---------------------------------------------------------------------*/ /* The public virtual function of this interface Node */ -/** - * Release a reference on a DOM node - * - * \param node The node to release the reference from - * - * If the reference count reaches zero and the node is not part of any - * document, any memory claimed by the node will be released. - * - * If the parent of the node is NULL but the reference count does not reach - * zero, this means we should put this node to the document's deletion pending - * list. When the refcnt reach zero, we delete it. - */ -void _dom_node_unref(dom_node_internal *node) -{ - if (node == NULL) - return; - - if (node->refcnt > 0) - node->refcnt--; - - dom_node_try_destroy(node); -} - /** * Retrieve the name of a DOM node * @@ -1872,7 +1836,7 @@ dom_exception _dom_node_copy_internal(dom_node_internal *old, new->prefix = NULL; new->user_data = NULL; - new->refcnt = 1; + new->base.refcnt = 1; list_init(&new->pending_list); @@ -2214,13 +2178,13 @@ dom_exception _dom_merge_adjacent_text(dom_node_internal *p, * * @note: Owning a node does not means this node's refcnt is above zero. */ -void _dom_node_try_destroy(dom_node_internal *node) +dom_exception _dom_node_try_destroy(dom_node_internal *node) { if (node == NULL) - return; + return DOM_NO_ERR; if (node->parent == NULL) { - if (node->refcnt == 0) { + if (node->base.refcnt == 0) { dom_node_destroy(node); } else if (node->pending_list.prev == &node->pending_list){ assert (node->pending_list.next == &node->pending_list); @@ -2228,6 +2192,8 @@ void _dom_node_try_destroy(dom_node_internal *node) &node->pending_list); } } + + return DOM_NO_ERR; } /** diff --git a/src/core/node.h b/src/core/node.h index 22540c7..87f3cb3 100644 --- a/src/core/node.h +++ b/src/core/node.h @@ -73,8 +73,6 @@ struct dom_node_internal { struct dom_user_data *user_data; /**< User data list */ - uint32_t refcnt; /**< Reference count */ - struct list_entry pending_list; /**< The document delete pending list */ dom_event_target_internal eti; /**< The EventTarget interface */ @@ -195,7 +193,8 @@ dom_exception _dom_node_get_user_data(dom_node_internal *node, _dom_node_remove_event_listener_ns #define DOM_NODE_VTABLE \ - _dom_node_get_node_name, \ + _dom_node_try_destroy, \ + _dom_node_get_node_name, \ _dom_node_get_node_value, \ _dom_node_set_node_value, \ _dom_node_get_node_type, \ @@ -283,8 +282,7 @@ dom_exception _dom_merge_adjacent_text(dom_node_internal *p, /* Try to destroy the node, if its refcnt is not zero, then append it to the * owner document's pending list */ -void _dom_node_try_destroy(dom_node_internal *node); -#define dom_node_try_destroy(n) _dom_node_try_destroy((dom_node_internal *) (n)) +dom_exception _dom_node_try_destroy(dom_node_internal *node); /* To add some node to the pending list */ void _dom_node_mark_pending(dom_node_internal *node); -- cgit v1.2.3