add document/context reference counter

Wed, 15 Apr 2026 11:19:25 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 15 Apr 2026 11:19:25 +0200
changeset 1089
a3db51a94b37
parent 1088
09459f07ab11
child 1090
ab2e458df182

add document/context reference counter

ui/common/context.c file | annotate | diff | comparison | revisions
ui/common/context.h file | annotate | diff | comparison | revisions
ui/common/document.c file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- a/ui/common/context.c	Tue Apr 14 18:08:20 2026 +0200
+++ b/ui/common/context.c	Wed Apr 15 11:19:25 2026 +0200
@@ -81,6 +81,8 @@
     }
 #endif
     
+    ctx->ref = 1;
+    
     return ctx;
 }
 
@@ -100,6 +102,25 @@
     cxListClear(ctx->state_widgets);
 }
 
+void uic_context_destroy(UiContext *ctx, void *document) {
+    if(!ctx) {
+        return;
+    }
+    
+    UiEvent ev;
+    ev.window = NULL;
+    ev.document = document;
+    ev.obj = NULL;
+    ev.eventdata = NULL;
+    ev.eventdatatype = 0;
+    ev.intval = 0;
+
+    if(ctx->close_callback) {
+        ctx->close_callback(&ev, ctx->close_data);
+    }
+    cxMempoolFree(ctx->mp);
+}
+
 void uic_context_attach_document(UiContext *ctx, void *document) {
     if(ctx->single_document_mode) {
         if(ctx->document) {
--- a/ui/common/context.h	Tue Apr 14 18:08:20 2026 +0200
+++ b/ui/common/context.h	Wed Apr 15 11:19:25 2026 +0200
@@ -100,6 +100,8 @@
     
     ui_callback   close_callback;
     void          *close_data;
+    
+    unsigned int  ref;
 };
 
 struct UiVar {
@@ -131,6 +133,7 @@
 void uic_context_add_destructor(UiContext *ctx, cx_destructor_func func, void *data);
 
 void uic_context_prepare_close(UiContext *ctx);
+void uic_context_destroy(UiContext *ctx, void *document);
 
 void uic_context_attach_document(UiContext *ctx, void *document);
 void uic_context_detach_document(UiContext *ctx, void *document);
--- a/ui/common/document.c	Tue Apr 14 18:08:20 2026 +0200
+++ b/ui/common/document.c	Wed Apr 15 11:19:25 2026 +0200
@@ -49,20 +49,22 @@
 }
 
 void ui_document_destroy(void *doc) {
+    uic_context_destroy(ui_document_context(doc), doc);
+}
+
+void ui_document_ref(void *doc) {
     UiContext *ctx = ui_document_context(doc);
     if(ctx) {
-        UiEvent ev;
-        ev.window = NULL;
-        ev.document = doc;
-        ev.obj = NULL;
-        ev.eventdata = NULL;
-        ev.eventdatatype = 0;
-        ev.intval = 0;
+        ctx->ref++;
+    }
+}
 
-        if(ctx->close_callback) {
-            ctx->close_callback(&ev, ctx->close_data);
+void ui_document_unref(void *doc) {
+    UiContext *ctx = ui_document_context(doc);
+    if(ctx) {
+        if(--ctx->ref == 0) {
+            uic_context_destroy(ctx, doc);
         }
-        cxMempoolFree(ctx->mp);
     }
 }
 
--- a/ui/ui/toolkit.h	Tue Apr 14 18:08:20 2026 +0200
+++ b/ui/ui/toolkit.h	Wed Apr 15 11:19:25 2026 +0200
@@ -572,6 +572,8 @@
 UIEXPORT void ui_threadpool_job(UiThreadpool* pool, UiObject* obj, ui_threadfunc tf, void* td, ui_callback f, void* fd);
 
 UIEXPORT void* ui_document_new(size_t size);
+UIEXPORT void  ui_document_ref(void *doc);
+UIEXPORT void  ui_document_unref(void *doc);
 UIEXPORT void  ui_document_destroy(void *doc);
 
 UIEXPORT void* ui_get_subdocument(void *document);               // deprecated

mercurial