Change in libosmocore[master]: ratectr: make atomic

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Hoernchen gerrit-no-reply at lists.osmocom.org
Thu Sep 9 14:06:21 UTC 2021


Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/25414 )


Change subject: ratectr: make atomic
......................................................................

ratectr: make atomic

This allows usage from different threads - (de)allocation is not
threadsafe!

Change-Id: I117f89add4798a250b5758543f1fb3e01d974205
---
M include/osmocom/core/rate_ctr.h
M src/rate_ctr.c
2 files changed, 15 insertions(+), 9 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/14/25414/1

diff --git a/include/osmocom/core/rate_ctr.h b/include/osmocom/core/rate_ctr.h
index d944cc0..ffaae91 100644
--- a/include/osmocom/core/rate_ctr.h
+++ b/include/osmocom/core/rate_ctr.h
@@ -5,7 +5,7 @@
  * \file rate_ctr.h */
 
 #include <stdint.h>
-
+#include <stdatomic.h>
 #include <osmocom/core/linuxlist.h>
 
 /*! Number of rate counter intervals */
@@ -21,14 +21,14 @@
 
 /*! data we keep for each of the intervals */
 struct rate_ctr_per_intv {
-	uint64_t last;		/*!< counter value in last interval */
-	uint64_t rate;		/*!< counter rate */
+	atomic_uint_fast64_t last;		/*!< counter value in last interval */
+	atomic_uint_fast64_t rate;		/*!< counter rate */
 };
 
 /*! data we keep for each actual value */
 struct rate_ctr {
-	uint64_t current;	/*!< current value */
-	uint64_t previous;	/*!< previous value, used for delta */
+	atomic_uint_fast64_t current;	/*!< current value */
+	atomic_uint_fast64_t previous;	/*!< previous value, used for delta */
 	/*! per-interval data */
 	struct rate_ctr_per_intv intv[RATE_CTR_INTV_NUM];
 };
diff --git a/src/rate_ctr.c b/src/rate_ctr.c
index 4d99699..aa02005 100644
--- a/src/rate_ctr.c
+++ b/src/rate_ctr.c
@@ -68,7 +68,9 @@
 #include <osmocom/core/rate_ctr.h>
 #include <osmocom/core/logging.h>
 
-static LLIST_HEAD(rate_ctr_groups);
+static __thread struct llist_head rate_ctr_groups;
+static __thread struct osmo_timer_list rate_ctr_timer;
+static __thread uint64_t timer_ticks;
 
 static void *tall_rate_ctr_ctx;
 
@@ -314,9 +316,6 @@
 		ctr->intv[intv+1].rate += ctr->intv[intv].rate;
 }
 
-static struct osmo_timer_list rate_ctr_timer;
-static uint64_t timer_ticks;
-
 /* The one-second interval has expired */
 static void rate_ctr_group_intv(struct rate_ctr_group *grp)
 {
@@ -354,6 +353,7 @@
  *  \returns 0 on success; negative on error */
 int rate_ctr_init(void *tall_ctx)
 {
+	INIT_LLIST_HEAD(&rate_ctr_groups);
 	tall_rate_ctr_ctx = tall_ctx;
 	osmo_timer_setup(&rate_ctr_timer, rate_ctr_timer_cb, NULL);
 	osmo_timer_schedule(&rate_ctr_timer, 1, 0);
@@ -467,4 +467,10 @@
 	}
 }
 
+/* ensure main thread always has pre-initialized osmo_fds */
+static __attribute__((constructor)) void on_dso_load_rate_ctr(void)
+{
+	INIT_LLIST_HEAD(&rate_ctr_groups);
+}
+
 /*! @} */

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/25414
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I117f89add4798a250b5758543f1fb3e01d974205
Gerrit-Change-Number: 25414
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <ewild at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210909/8c816b5d/attachment.htm>


More information about the gerrit-log mailing list