afb-api-so: take care of SIGSEGV in dlopen
[src/app-framework-binder.git] / src / afb-session.c
index 523cbf0..6fb29bf 100644 (file)
@@ -120,7 +120,7 @@ static void free_data (struct afb_session *session)
 void afb_session_init (int max_session_count, int timeout, const char *initok)
 {
        // let's create as store as hashtable does not have any
-       sessions.store = calloc (1 + (unsigned)max_session_count, sizeof(struct afb_session));
+       sessions.store = calloc (1 + (unsigned)max_session_count, sizeof *sessions.store);
        pthread_mutex_init(&sessions.mutex, NULL);
        sessions.max = max_session_count;
        sessions.timeout = timeout;
@@ -324,7 +324,7 @@ struct afb_session *afb_session_get (const char *uuid, int *created)
 struct afb_session *afb_session_addref(struct afb_session *session)
 {
        if (session != NULL)
-               session->refcount++;
+               __atomic_add_fetch(&session->refcount, 1, __ATOMIC_RELAXED);
        return session;
 }
 
@@ -332,11 +332,12 @@ void afb_session_unref(struct afb_session *session)
 {
        if (session != NULL) {
                assert(session->refcount != 0);
-               --session->refcount;
-               if (session->refcount == 0 && session->uuid[0] == 0) {
-                       destroy (session);
-                       pthread_mutex_destroy(&session->mutex);
-                       free(session);
+               if (!__atomic_sub_fetch(&session->refcount, 1, __ATOMIC_RELAXED)) {
+                       if (session->uuid[0] == 0) {
+                               destroy (session);
+                               pthread_mutex_destroy(&session->mutex);
+                               free(session);
+                       }
                }
        }
 }