Fixed more refcount
authorJeroen van der Heijden <jeroen@transceptor.technology>
Thu, 21 Jan 2021 21:36:18 +0000 (22:36 +0100)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Thu, 21 Jan 2021 21:36:18 +0000 (22:36 +0100)
22 files changed:
include/siri/db/db.h
include/siri/db/group.h
include/siri/db/groups.h
include/siri/db/series.h
include/siri/db/server.h
include/siri/db/shard.h
include/siri/db/tag.h
include/siri/db/tags.h
include/siri/db/user.h
include/siri/net/promise.h
include/siri/net/stream.h
include/siri/version.h
include/vec/vec.h
src/siri/backup.c
src/siri/db/group.c
src/siri/db/groups.c
src/siri/db/series.c
src/siri/db/shard.c
src/siri/db/shards.c
src/siri/db/tag.c
src/siri/db/tags.c
src/siri/net/bserver.c

index be216938ad77540a65e377ec5953b5671b3e2d93..20fb8fadf9861c83c36a3e83087db96c63253c9b 100644 (file)
@@ -55,8 +55,9 @@ void siridb__free(siridb_t * siridb);
 void siridb_drop(siridb_t * siridb);
 void siridb_update_shard_expiration(siridb_t * siridb);
 
-#define siridb_incref(siridb) siridb->ref++
-#define siridb_decref(_siridb) if (!--_siridb->ref) siridb__free(_siridb)
+#define siridb_incref(siridb__) __atomic_add_fetch(&(siridb__)->ref, 1, __ATOMIC_SEQ_CST)
+#define siridb_decref(siridb__) \
+    if (!__atomic_sub_fetch(&(siridb__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__free(siridb__)
 #define siridb_is_reindexing(siridb) (siridb->flags & SIRIDB_FLAG_REINDEXING)
 
 struct siridb_s
index d1d38606186cd606ed9511e1cc27f931c319bc9f..2eb33d51f10f238c0eb139b42be40746a5db7702 100644 (file)
@@ -42,9 +42,9 @@ int siridb_group_is_remote_prop(uint32_t prop);
 void siridb__group_decref(siridb_group_t * group);
 void siridb__group_free(siridb_group_t * group);
 
-#define siridb_group_incref(group__) (group__)->ref++
+#define siridb_group_incref(group__) __atomic_add_fetch(&(group__)->ref, 1, __ATOMIC_SEQ_CST)
 #define siridb_group_decref(group__) \
-        if (!--(group__)->ref) siridb__group_free(group__)
+        if (!__atomic_sub_fetch(&(group__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__group_free(group__)
 
 struct siridb_group_s
 {
index 900cdd3b8a3ce3f370ee64229a92d9e99789f3d2..5ff1d18d92d4bbf5cb957ac20e546422a7c1c52d 100644 (file)
@@ -65,6 +65,7 @@ int siridb_groups_add_group(
 int siridb_groups_add_series(
         siridb_groups_t * groups,
         siridb_series_t * series);
+void siridb__groups_free(siridb_groups_t * groups);
 
 struct siridb_groups_s
 {
@@ -78,4 +79,10 @@ struct siridb_groups_s
     uv_mutex_t mutex;
     uv_thread_t thread;
 };
+
+#define siridb_groups_incref(groups__) __atomic_add_fetch(&(groups__)->ref, 1, __ATOMIC_SEQ_CST)
+#define siridb_groups_decref(groups__) \
+    if (!__atomic_sub_fetch(&(groups__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__groups_free(groups__)
+
+
 #endif  /* SIRIDB_GROUPS_H_ */
index 0e051aa8796c005699885e093190982045607592..05b1f3a4f5b3f3b542e144d612101ea212e48e4a 100644 (file)
@@ -128,15 +128,14 @@ void siridb_series_ensure_type(siridb_series_t * series, qp_obj_t * qp_obj);
 /*
  * Increment the series reference counter.
  */
-#define siridb_series_incref(series) series->ref++
-
+#define siridb_series_incref(series__) __atomic_add_fetch(&(series__)->ref, 1, __ATOMIC_SEQ_CST)
 /*
+ *
  * Decrement reference counter for series and free the series when zero is
  * reached.
  */
 #define siridb_series_decref(series__) \
-        if (!--series__->ref) siridb__series_free(series__)
-
+    if (!__atomic_sub_fetch(&(series__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__series_free(series__)
 
 #define siridb_series_server_id(series) \
 ((series->flags & SIRIDB_SERIES_IS_SERVER_ONE) == SIRIDB_SERIES_IS_SERVER_ONE)
index 2b74cd12e145b7102a5999a09e63637e564680da..ae188b8d64d6aa8cd492cd1188773eeddf1b51ea 100644 (file)
@@ -130,7 +130,7 @@ void siridb__server_free(siridb_server_t * server);
 #define siridb_server_update_flags(org, new) \
     org = new | (org & (SERVER_FLAG_AUTHENTICATED | SERVER_FLAG_QUEUE_FULL))
 
-#define siridb_server_incref(server) server->ref++
+#define siridb_server_incref(server__) __atomic_add_fetch(&(server__)->ref, 1, __ATOMIC_SEQ_CST)
 
 /*
  * Decrement server reference counter and free the server when zero is reached.
@@ -138,7 +138,7 @@ void siridb__server_free(siridb_server_t * server);
  * and each promise->cb() will be called.
  */
 #define siridb_server_decref(server__) \
-    if (!--server__->ref) siridb__server_free(server__)
+    if (!__atomic_sub_fetch(&(server__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__server_free(server__)
 
 struct siridb_server_s
 {
index 969ef74dbcbe88c09480ca5a7ccd02bdec174615..759af9227b553ac0035621e6f2c61c5fddb1c31e 100644 (file)
@@ -162,7 +162,7 @@ static inline siridb_shard_get_points_cb siridb_shard_get_points_callback(
 /*
  * Increment the shard reference counter.
  */
-#define siridb_shard_incref(shard) shard->ref++
+#define siridb_shard_incref(shard__) __atomic_add_fetch(&(shard__)->ref, 1, __ATOMIC_SEQ_CST)
 
 /*
  * Decrement the reference counter, when 0 the shard will be destroyed.
@@ -173,7 +173,7 @@ static inline siridb_shard_get_points_cb siridb_shard_get_points_callback(
  * A signal can be raised in case closing the shard file fails.
  */
 #define siridb_shard_decref(shard__)     \
-        if (!--shard__->ref) siridb__shard_free(shard__)
+        if (!__atomic_sub_fetch(&(shard__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__shard_free(shard__)
 
 
 #define siridb_shard_idx_file(Name__, Fn__)         \
index a5f340d2479140f24ab2e41aa104943b07fef013..3e8823f9c9b4998c0ff56f4f646e84d429535a33 100644 (file)
@@ -33,9 +33,9 @@ int siridb_tag_set_name(
         const char * name,
         char * err_msg);
 
-#define siridb_tag_incref(tag__) (tag__)->ref++
+#define siridb_tag_incref(tag__) __atomic_add_fetch(&(tag__)->ref, 1, __ATOMIC_SEQ_CST)
 #define siridb_tag_decref(tag__) \
-        if (!--(tag__)->ref) siridb__tag_free(tag__)
+        if (!__atomic_sub_fetch(&(tag__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__tag_free(tag__)
 
 struct siridb_tag_s
 {
index 9a24c6c6b12d58ca8a3d9506c4846b7f0d9b1072..f8a40a0661fae69353c13a66454022145821eccd 100644 (file)
@@ -33,8 +33,6 @@ struct siridb_tags_s
 };
 
 int siridb_tags_init(siridb_t * siridb);
-void siridb_tags_incref(siridb_tags_t * tags);
-void siridb_tags_decref(siridb_tags_t * tags);
 int siridb_tags_drop_tag(
         siridb_tags_t * tags,
         const char * name,
@@ -50,7 +48,7 @@ void siridb_tags_init_nseries(siridb_tags_t * tags);
 sirinet_pkg_t * siridb_tags_pkg(siridb_tags_t * tags, uint16_t pid);
 sirinet_pkg_t * siridb_tags_series(siridb_series_t * series);
 sirinet_pkg_t * siridb_tags_empty(siridb_tags_t * tags);
-
+void siridb__tags_free(siridb_tags_t * tags);
 
 #define siridb_tags_set_require_save(__tags, __tag) \
 do{                                                 \
@@ -58,4 +56,9 @@ do{                                                 \
     (__tag)->flags |= TAG_FLAG_REQUIRE_SAVE;        \
 }while(0)
 
+
+#define siridb_tags_incref(tags__) __atomic_add_fetch(&(tags__)->ref, 1, __ATOMIC_SEQ_CST)
+#define siridb_tags_decref(tags__) \
+        if (!__atomic_sub_fetch(&(tags__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__tags_free(tags__)
+
 #endif  /* SIRIDB_TAGS_H_ */
index d333d732cf539ad86f9bfe15a874b75a9df1fd66..a9ffed3f42c676e075c0f252771c3218e065d303 100644 (file)
@@ -36,13 +36,13 @@ int siridb_user_cexpr_cb(siridb_user_t * user, cexpr_condition_t * cond);
 /*
  * Increment the user reference counter.
  */
-#define siridb_user_incref(user) user->ref++
+#define siridb_user_incref(user__) __atomic_add_fetch(&(user__)->ref, 1, __ATOMIC_SEQ_CST)
 
 /*
  * Decrement user reference counter and free the user when zero is reached.
  */
 #define siridb_user_decref(user__) \
-    if (!--user__->ref) siridb__user_free(user__)
+    if (!__atomic_sub_fetch(&(user__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__user_free(user__)
 
 struct siridb_user_s
 {
index 85273e27f78ffd7f96165f825faff35b5cfab2d9..d66ff7340a3e33e5c3bea445e7020631b33471b7 100644 (file)
@@ -27,7 +27,6 @@ typedef void (* sirinet_promise_cb)(
 #include <siri/net/pkg.h>
 
 
-
 const char * sirinet_promise_strstatus(sirinet_promise_status_t status);
 
 #define sirinet_promise_incref(p__) (p__)->ref++
index 16c79b3ff787a455c5eed7a5c75069335c914834..b07065f4f2f622428fce525caf0fd797c294ea61 100644 (file)
@@ -36,12 +36,12 @@ void sirinet_stream_on_data(
         const uv_buf_t * buf);
 void sirinet__stream_free(uv_stream_t * uvclient);
 
-#define sirinet_stream_incref(client) \
-    (client)->ref++
+#define sirinet_stream_incref(client__) \
+    __atomic_add_fetch(&(client__)->ref, 1, __ATOMIC_SEQ_CST)
 
-#define sirinet_stream_decref(client)               \
-    if (!--(client)->ref) uv_close(                 \
-        (uv_handle_t *) (client)->stream,           \
+#define sirinet_stream_decref(client__)                                       \
+    if (!__atomic_sub_fetch(&(client__)->ref, 1, __ATOMIC_SEQ_CST)) uv_close( \
+        (uv_handle_t *) (client__)->stream,                                   \
         (uv_close_cb) sirinet__stream_free)
 
 struct sirinet_stream_s
index 15a908e9b698ca5191b0920257c6aaa0c4ffbe1f..0e27752fe372aaba51fa61f418eeb535e1fa6a22 100644 (file)
@@ -15,7 +15,7 @@
  * Note that debian alpha packages should use versions like this:
  *   2.0.34-0alpha0
  */
-#define SIRIDB_VERSION_PRE_RELEASE "-alpha-1"
+#define SIRIDB_VERSION_PRE_RELEASE "-alpha-2"
 
 #ifndef NDEBUG
 #define SIRIDB_VERSION_BUILD_RELEASE "+debug"
index 31b769a5ed5562e50edb4529cd8fc5a9634dace9..b2cd1e285bca07a23407d45444cb9d188623d0dc 100644 (file)
@@ -24,7 +24,7 @@ int vec_append_safe(vec_t ** vec, void * data);
  * Expects the object to have a object->ref (uint_xxx_t) on top of the
  * objects definition.
  */
-#define vec_object_incref(object) ((vec_object_t * ) object)->ref++
+#define vec_object_incref(object__) __atomic_add_fetch(&((vec_object_t * ) object__)->ref, 1, __ATOMIC_SEQ_CST)
 
 /*
  * Expects the object to have a object->ref (uint_xxx_t) on top of the
@@ -34,7 +34,7 @@ int vec_append_safe(vec_t ** vec, void * data);
  *          there are still references left on the object since an object
  *          probably needs specific cleanup tasks.
  */
-#define vec_object_decref(object) ((vec_object_t * ) object)->ref--
+#define vec_object_decref(object__) __atomic_sub_fetch(&((vec_object_t * ) object__)->ref, 1, __ATOMIC_SEQ_CST)
 
 /*
  * Append data to the list. This functions assumes the list can hold the new
index 217f4ee73d81c0165e676ceed2c13507b51eba12..5b8a91da35674703b184c8522f5883a92b0c9259 100644 (file)
@@ -228,7 +228,7 @@ static int BACKUP_walk(siridb_t * siridb, void * args __attribute__((unused)))
             {
                 siri_fp_close(shard->replacing->fp);
             }
-            --shard->ref;  /* at least two references exist */
+            siridb_shard_decref(shard);
         }
 
         vec_free(shard_list);
index 45b370d65c379a82f259944dcc201011e61eef60..885d7fd320baa8a3569b1f7b8607de6d4768bde6 100644 (file)
@@ -153,10 +153,7 @@ int siridb_group_set_name(
  */
 void siridb__group_decref(siridb_group_t * group)
 {
-    if (!--group->ref)
-    {
-        siridb__group_free(group);
-    }
+    siridb_group_decref(group);
 }
 
 /*
index 7a270b9323ce488ed74de6e24ba973da9be8cd26..cb24a96d7c61a279e9d87e8eea578b31b44ba372 100644 (file)
@@ -46,7 +46,6 @@
 #define CALC_BATCH_SIZE(sz) GROUPS_RE_BATCH_SZ /((sz / 5 ) + 1) + 1;
 
 static int GROUPS_load(siridb_t * siridb);
-static void GROUPS_free(siridb_groups_t * groups);
 static int GROUPS_pkg(siridb_group_t * group, qp_packer_t * packer);
 static int GROUPS_nseries(siridb_group_t * group, void * data);
 static void GROUPS_loop(void * arg);
@@ -82,7 +81,7 @@ int siridb_groups_init(siridb_t * siridb)
             !siridb->groups->ngroups)
     {
         ERR_ALLOC
-        GROUPS_free(siridb->groups);
+        siridb__groups_free(siridb->groups);
         siridb->groups = NULL;
         return -1;
     }
@@ -94,7 +93,7 @@ int siridb_groups_init(siridb_t * siridb)
                 SIRIDB_GROUPS_FN) < 0 || GROUPS_load(siridb))
     {
         ERR_ALLOC
-        GROUPS_free(siridb->groups);
+        siridb__groups_free(siridb->groups);
         siridb->groups = NULL;
         return -1;
     }
@@ -330,19 +329,6 @@ int siridb_groups_drop_group(
     return 0;
 }
 
-void siridb_groups_incref(siridb_groups_t * groups)
-{
-    groups->ref++;
-}
-
-void siridb_groups_decref(siridb_groups_t * groups)
-{
-    if (!--groups->ref)
-    {
-        GROUPS_free(groups);
-    }
-}
-
 /*
  * Main thread.
  */
@@ -366,7 +352,7 @@ static int GROUPS_nseries(
     return 0;
 }
 
-static void GROUPS_free(siridb_groups_t * groups)
+void siridb__groups_free(siridb_groups_t * groups)
 {
     size_t i;
     free(groups->fn);
index f4f5b355fc0850fe25da24566500d0d264bf3052..9515ba44eb395dea909b8c9e81ed26e695806ca1 100644 (file)
@@ -774,10 +774,7 @@ siridb_points_t * siridb_series_get_points(
  */
 void siridb__series_decref(siridb_series_t * series)
 {
-    if (!--series->ref)
-    {
-        siridb__series_free(series);
-    }
+    siridb_series_decref(series);
 }
 
 siridb_points_t * siridb_series_get_first(
index 3bdf141c5625b4eaebe4c17bad09a26721f16fb5..fc1dbd2c009f0136e98bf81d0247fe751941e783 100644 (file)
@@ -1569,10 +1569,7 @@ int siridb_shard_optimize(siridb_shard_t * shard, siridb_t * siridb)
  */
 void siridb__shard_decref(siridb_shard_t * shard)
 {
-    if (!--shard->ref)
-    {
-        siridb__shard_free(shard);
-    }
+    siridb_shard_decref(shard);
 }
 
 void siridb_shard_drop(siridb_shard_t * shard, siridb_t * siridb)
index d399fb63f2411e80f6d8d78302d0d470a6be3bd4..6eff024591a3d1cf18dbd5878a212c8ba5a743ab 100644 (file)
@@ -389,7 +389,7 @@ static inline int SHARDS_to_vec_cb(omap_t * omap, vec_t * v)
     for (;iter && (shard = iter->data_); iter = iter->next_)
     {
         vec_append(v, shard);
-        ++shard->ref;
+        siridb_shard_incref(shard);
     }
     return 0;
 }
index 486b88114f82054475d4237230a41cd85ca90f7b..d4aed6ac14336bc3115184523467db1a7c052afd 100644 (file)
@@ -314,10 +314,7 @@ int siridb_tag_set_name(
  */
 void siridb__tag_decref(siridb_tag_t * tag)
 {
-    if (!--tag->ref)
-    {
-        siridb__tag_free(tag);
-    }
+    siridb_tag_decref(tag);
 }
 
 /*
index 995abbce3a852ee8aae59509f0b8e600086c9956..fe4697b506d0ab85ca9aed54ee4045d4880fa69d 100644 (file)
@@ -20,7 +20,6 @@
 #include <unistd.h>
 #include <siri/siri.h>
 
-static void TAGS_free(siridb_tags_t * tags);
 static int TAGS_load(siridb_t * siridb);
 static int TAGS_dropped_series(
         siridb_tag_t * tag,
@@ -55,7 +54,7 @@ int siridb_tags_init(siridb_t * siridb)
             siridb->tags->tags == NULL ||
             TAGS_load(siridb))
     {
-        TAGS_free(siridb->tags);
+        siridb__tags_free(siridb->tags);
         siridb->tags = NULL;
         return -1;
     }
@@ -63,19 +62,6 @@ int siridb_tags_init(siridb_t * siridb)
     return 0;
 }
 
-void siridb_tags_incref(siridb_tags_t * tags)
-{
-    tags->ref++;
-}
-
-void siridb_tags_decref(siridb_tags_t * tags)
-{
-    if (!--tags->ref)
-    {
-        TAGS_free(tags);
-    }
-}
-
 /*
  * Main thread.
  *
@@ -429,7 +415,7 @@ static int TAGS_load(siridb_t * siridb)
     return rc;
 }
 
-static void TAGS_free(siridb_tags_t * tags)
+void siridb__tags_free(siridb_tags_t * tags)
 {
     if (tags->flags & TAGS_FLAG_REQUIRE_SAVE)
     {
index f5b66daac30ee2db0ff40f46d3cfedcad2f2d504..3fd9b81be91a40b05da30ee722fd7e91dee49134 100644 (file)
@@ -884,8 +884,7 @@ static void on_series_tags(sirinet_stream_t * client, sirinet_pkg_t * pkg)
                 qp_obj_t qp_tag_name;
 
                 /* take a reference since this task might wait for a lock */
-
-                ++series->ref;
+                siridb_series_incref(series);
 
                 uv_mutex_lock(&siridb->tags->mutex);