summaryrefslogtreecommitdiff
path: root/include/dom/core/node.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/dom/core/node.h')
-rw-r--r--include/dom/core/node.h17
1 files changed, 13 insertions, 4 deletions
diff --git a/include/dom/core/node.h b/include/dom/core/node.h
index 90026a1..37fd2b8 100644
--- a/include/dom/core/node.h
+++ b/include/dom/core/node.h
@@ -73,12 +73,18 @@ typedef enum {
typedef struct dom_node_internal dom_node_internal;
+struct dom_refcheck;
+struct dom_refcheck *dom_refcheck(
+ struct dom_refcheck *rc,
+ uint32_t refcnt);
+
/**
* DOM node type
*/
typedef struct dom_node {
const void *vtable;
uint32_t refcnt;
+ struct dom_refcheck *rc;
} dom_node;
/* DOM node vtable */
@@ -177,9 +183,11 @@ typedef struct dom_node_vtable {
static inline dom_node *dom_node_ref(dom_node *node)
{
- if (node != NULL)
+ if (node != NULL) {
node->refcnt++;
-
+ node->rc = dom_refcheck(node->rc, node->refcnt);
+ }
+
return node;
}
@@ -195,10 +203,11 @@ static inline dom_exception dom_node_try_destroy(dom_node *node)
static inline void dom_node_unref(dom_node *node)
{
if (node != NULL) {
- if (--node->refcnt == 0)
+ node->refcnt--;
+ node->rc = dom_refcheck(node->rc, node->refcnt);
+ if (node->refcnt == 0)
dom_node_try_destroy(node);
}
-
}
#define dom_node_unref(n) dom_node_unref((dom_node *) (n))