libidav/session.c

branch
dav-2
changeset 914
42c6b071b231
parent 893
38800d479cd4
--- a/libidav/session.c	Sat Feb 14 18:11:29 2026 +0100
+++ b/libidav/session.c	Sat Jun 20 19:00:56 2026 +0200
@@ -38,6 +38,7 @@
 #include "session.h"
 #include "resource.h"
 #include "methods.h"
+#include "atomic.h"
 
 DavSession* dav_session_new(DavContext *context, char *base_url) {
     if(!base_url) {
@@ -95,6 +96,9 @@
     // add to context
     dav_context_add_session(context, sn);
     sn->context = context;
+    dav_context_ref(context);
+    
+    sn->ref = 1;
     
     return sn;
 }
@@ -138,10 +142,23 @@
     // add to context
     dav_context_add_session(sn->context, newsn);
     newsn->context = sn->context;
+    dav_context_ref(sn->context);
+    
+    newsn->ref = 1;
 
     return newsn;
 }
 
+void dav_session_ref(DavSession *sn) {
+    dav_atomic_inc32(&sn->ref);
+}
+
+void dav_session_unref(DavSession *sn) {
+    if(dav_atomic_dec32(&sn->ref) == 0) {
+        dav_session_destroy(sn);
+    }
+}
+
 void dav_session_set_auth(DavSession *sn, const char *user, const char *password) {
     if(user && password) {
         dav_session_set_auth_s(sn, cx_str(user), cx_str(password));
@@ -344,15 +361,19 @@
 
 void dav_session_destroy(DavSession *sn) { 
     // remove session from context
-    if (dav_context_remove_session(sn->context, sn)) {
+    DavContext *ctx = sn->context;
+    dav_context_ref(ctx);
+    if (dav_context_remove_session(ctx, sn)) {
         fprintf(stderr, "Error: session not found in ctx->sessions\n");
         dav_session_destructor(sn);
     }
+    dav_context_unref(ctx);
 }
 
 void dav_session_destructor(DavSession *sn) {
     cxMempoolFree(sn->mp);
     curl_easy_cleanup(sn->handle);
+    dav_context_unref(sn->context);
     free(sn);
 }
 

mercurial