diff options
author | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2012-03-28 19:33:33 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2012-03-28 19:33:33 +0000 |
commit | 1aa65d46aa7c2861612e912c0ce44f53d5b35df7 (patch) | |
tree | 8e40217b9719be155e97e030a7980d2bc0e471d7 /include/dom/core | |
parent | fea71815737d9da24f66c440f02aa16ee256c770 (diff) | |
download | libdom-1aa65d46aa7c2861612e912c0ce44f53d5b35df7.tar.gz libdom-1aa65d46aa7c2861612e912c0ce44f53d5b35df7.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.h | 35 |
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) |