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
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
{
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
{
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_ */
/*
* 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)
#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.
* 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
{
/*
* 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.
* 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__) \
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
{
};
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,
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{ \
(__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_ */
/*
* 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
{
#include <siri/net/pkg.h>
-
const char * sirinet_promise_strstatus(sirinet_promise_status_t status);
#define sirinet_promise_incref(p__) (p__)->ref++
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
* 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"
* 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
* 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
{
siri_fp_close(shard->replacing->fp);
}
- --shard->ref; /* at least two references exist */
+ siridb_shard_decref(shard);
}
vec_free(shard_list);
*/
void siridb__group_decref(siridb_group_t * group)
{
- if (!--group->ref)
- {
- siridb__group_free(group);
- }
+ siridb_group_decref(group);
}
/*
#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);
!siridb->groups->ngroups)
{
ERR_ALLOC
- GROUPS_free(siridb->groups);
+ siridb__groups_free(siridb->groups);
siridb->groups = NULL;
return -1;
}
SIRIDB_GROUPS_FN) < 0 || GROUPS_load(siridb))
{
ERR_ALLOC
- GROUPS_free(siridb->groups);
+ siridb__groups_free(siridb->groups);
siridb->groups = NULL;
return -1;
}
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.
*/
return 0;
}
-static void GROUPS_free(siridb_groups_t * groups)
+void siridb__groups_free(siridb_groups_t * groups)
{
size_t i;
free(groups->fn);
*/
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(
*/
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)
for (;iter && (shard = iter->data_); iter = iter->next_)
{
vec_append(v, shard);
- ++shard->ref;
+ siridb_shard_incref(shard);
}
return 0;
}
*/
void siridb__tag_decref(siridb_tag_t * tag)
{
- if (!--tag->ref)
- {
- siridb__tag_free(tag);
- }
+ siridb_tag_decref(tag);
}
/*
#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,
siridb->tags->tags == NULL ||
TAGS_load(siridb))
{
- TAGS_free(siridb->tags);
+ siridb__tags_free(siridb->tags);
siridb->tags = NULL;
return -1;
}
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.
*
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)
{
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);