diff options
Diffstat (limited to 'include/dom')
-rw-r--r-- | include/dom/core/node.h | 17 |
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)) |