summaryrefslogtreecommitdiff
path: root/include/dom/core
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@netsurf-browser.org>2012-03-28 19:33:33 +0000
committerDaniel Silverstone <dsilvers@netsurf-browser.org>2012-03-28 19:33:33 +0000
commit805473190561d60f06e3b5d63cc30029137cf593 (patch)
tree8e40217b9719be155e97e030a7980d2bc0e471d7 /include/dom/core
parent06aebd84b7e2cc8e573642b220b1667afff0bff6 (diff)
downloadlibdom-805473190561d60f06e3b5d63cc30029137cf593.tar.gz
libdom-805473190561d60f06e3b5d63cc30029137cf593.tar.bz2
Promote ref/unref in dom_node to be inlines.
svn path=/trunk/libdom/; revision=13761
Diffstat (limited to 'include/dom/core')
-rw-r--r--include/dom/core/node.h35
1 files changed, 30 insertions, 5 deletions
diff --git a/include/dom/core/node.h b/include/dom/core/node.h
index a0872e2..87f1af0 100644
--- a/include/dom/core/node.h
+++ b/include/dom/core/node.h
@@ -78,12 +78,14 @@ typedef struct dom_node_internal dom_node_internal;
*/
typedef struct dom_node {
void *vtable;
+ uint32_t refcnt;
} dom_node;
/* DOM node vtable */
typedef struct dom_node_vtable {
dom_event_target_vtable base;
-
+ /* pre-destruction hook */
+ dom_exception (*dom_node_try_destroy)(dom_node_internal *node);
/* The DOM level 3 node's oprations */
dom_exception (*dom_node_get_node_name)(dom_node_internal *node,
dom_string **result);
@@ -172,10 +174,33 @@ typedef struct dom_node_vtable {
} dom_node_vtable;
/* The ref/unref methods define */
-struct dom_node *_dom_node_ref(dom_node_internal *node);
-#define dom_node_ref(n) _dom_node_ref((dom_node_internal *) (n))
-void _dom_node_unref(dom_node_internal *node);
-#define dom_node_unref(n) _dom_node_unref((dom_node_internal *) (n))
+
+static inline dom_node *dom_node_ref(dom_node *node)
+{
+ if (node != NULL)
+ node->refcnt++;
+
+ return node;
+}
+
+#define dom_node_ref(n) dom_node_ref((dom_node *) (n))
+
+static inline dom_exception dom_node_try_destroy(dom_node *node)
+{
+ return ((dom_node_vtable *) node->vtable)->dom_node_try_destroy(
+ (dom_node_internal *) node);
+}
+#define dom_node_try_destroy(n) dom_node_try_destroy((dom_node *) (n))
+
+static inline void dom_node_unref(dom_node *node)
+{
+ if (node != NULL) {
+ if (--node->refcnt == 0)
+ dom_node_try_destroy(node);
+ }
+
+}
+#define dom_node_unref(n) dom_node_unref((dom_node *) (n))
static inline dom_exception dom_node_get_node_name(struct dom_node *node,
dom_string **result)