<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/25414">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ratectr: make atomic<br><br>This allows usage from different threads - (de)allocation is not<br>threadsafe!<br><br>Change-Id: I117f89add4798a250b5758543f1fb3e01d974205<br>---<br>M include/osmocom/core/rate_ctr.h<br>M src/rate_ctr.c<br>2 files changed, 15 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/14/25414/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/rate_ctr.h b/include/osmocom/core/rate_ctr.h</span><br><span>index d944cc0..ffaae91 100644</span><br><span>--- a/include/osmocom/core/rate_ctr.h</span><br><span>+++ b/include/osmocom/core/rate_ctr.h</span><br><span>@@ -5,7 +5,7 @@</span><br><span>  * \file rate_ctr.h */</span><br><span> </span><br><span> #include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdatomic.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> </span><br><span> /*! Number of rate counter intervals */</span><br><span>@@ -21,14 +21,14 @@</span><br><span> </span><br><span> /*! data we keep for each of the intervals */</span><br><span> struct rate_ctr_per_intv {</span><br><span style="color: hsl(0, 100%, 40%);">-  uint64_t last;          /*!< counter value in last interval */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint64_t rate;          /*!< counter rate */</span><br><span style="color: hsl(120, 100%, 40%);">+       atomic_uint_fast64_t last;              /*!< counter value in last interval */</span><br><span style="color: hsl(120, 100%, 40%);">+     atomic_uint_fast64_t rate;              /*!< counter rate */</span><br><span> };</span><br><span> </span><br><span> /*! data we keep for each actual value */</span><br><span> struct rate_ctr {</span><br><span style="color: hsl(0, 100%, 40%);">-     uint64_t current;       /*!< current value */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint64_t previous;      /*!< previous value, used for delta */</span><br><span style="color: hsl(120, 100%, 40%);">+     atomic_uint_fast64_t current;   /*!< current value */</span><br><span style="color: hsl(120, 100%, 40%);">+      atomic_uint_fast64_t previous;  /*!< previous value, used for delta */</span><br><span>    /*! per-interval data */</span><br><span>     struct rate_ctr_per_intv intv[RATE_CTR_INTV_NUM];</span><br><span> };</span><br><span>diff --git a/src/rate_ctr.c b/src/rate_ctr.c</span><br><span>index 4d99699..aa02005 100644</span><br><span>--- a/src/rate_ctr.c</span><br><span>+++ b/src/rate_ctr.c</span><br><span>@@ -68,7 +68,9 @@</span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(rate_ctr_groups);</span><br><span style="color: hsl(120, 100%, 40%);">+static __thread struct llist_head rate_ctr_groups;</span><br><span style="color: hsl(120, 100%, 40%);">+static __thread struct osmo_timer_list rate_ctr_timer;</span><br><span style="color: hsl(120, 100%, 40%);">+static __thread uint64_t timer_ticks;</span><br><span> </span><br><span> static void *tall_rate_ctr_ctx;</span><br><span> </span><br><span>@@ -314,9 +316,6 @@</span><br><span>           ctr->intv[intv+1].rate += ctr->intv[intv].rate;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_timer_list rate_ctr_timer;</span><br><span style="color: hsl(0, 100%, 40%);">-static uint64_t timer_ticks;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* The one-second interval has expired */</span><br><span> static void rate_ctr_group_intv(struct rate_ctr_group *grp)</span><br><span> {</span><br><span>@@ -354,6 +353,7 @@</span><br><span>  *  \returns 0 on success; negative on error */</span><br><span> int rate_ctr_init(void *tall_ctx)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   INIT_LLIST_HEAD(&rate_ctr_groups);</span><br><span>       tall_rate_ctr_ctx = tall_ctx;</span><br><span>        osmo_timer_setup(&rate_ctr_timer, rate_ctr_timer_cb, NULL);</span><br><span>      osmo_timer_schedule(&rate_ctr_timer, 1, 0);</span><br><span>@@ -467,4 +467,10 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* ensure main thread always has pre-initialized osmo_fds */</span><br><span style="color: hsl(120, 100%, 40%);">+static __attribute__((constructor)) void on_dso_load_rate_ctr(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      INIT_LLIST_HEAD(&rate_ctr_groups);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! @} */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/25414">change 25414</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/25414"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I117f89add4798a250b5758543f1fb3e01d974205 </div>
<div style="display:none"> Gerrit-Change-Number: 25414 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>