summaryrefslogtreecommitdiff
path: root/src/common/compat_threads.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-04-25 10:29:07 -0400
committerNick Mathewson <nickm@torproject.org>2017-04-25 10:29:07 -0400
commit4266ec766af8e210ac52f597699b44818960ee39 (patch)
tree902ce2bd58a59f78b8317e2277ecddbf233cdae3 /src/common/compat_threads.c
parent91dd4a00f7d4891e24187a849933547128aeeb9f (diff)
downloadtor-4266ec766af8e210ac52f597699b44818960ee39.tar.gz
tor-4266ec766af8e210ac52f597699b44818960ee39.zip
Use atomic counters for compressor allocation.
Diffstat (limited to 'src/common/compat_threads.c')
-rw-r--r--src/common/compat_threads.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c
index 7b28a9494a..8d026dd5a7 100644
--- a/src/common/compat_threads.c
+++ b/src/common/compat_threads.c
@@ -352,3 +352,48 @@ alert_sockets_close(alert_sockets_t *socks)
socks->read_fd = socks->write_fd = -1;
}
+/*
+ * XXXX We might be smart to move to compiler intrinsics or real atomic
+ * XXXX operations at some point. But not yet.
+ *
+ */
+
+/** Initialize a new atomic counter with the value 0 */
+void
+atomic_counter_init(atomic_counter_t *counter)
+{
+ tor_mutex_init_nonrecursive(&counter->mutex);
+ counter->val = 0;
+}
+/** Clean up all resources held by an atomic counter. */
+void
+atomic_counter_destroy(atomic_counter_t *counter)
+{
+ tor_mutex_uninit(&counter->mutex);
+ memset(counter, 0, sizeof(*counter));
+}
+/** Add a value to an atomic counter. */
+void
+atomic_counter_add(atomic_counter_t *counter, size_t add)
+{
+ tor_mutex_acquire(&counter->mutex);
+ counter->val += add;
+ tor_mutex_release(&counter->mutex);
+}
+/** Subtract a value from an atomic counter. */
+void
+atomic_counter_sub(atomic_counter_t *counter, size_t sub)
+{
+ // this relies on unsigned overflow, but that's fine.
+ atomic_counter_add(counter, -sub);
+}
+/** Return the current value of an atomic counter */
+size_t
+atomic_counter_get(atomic_counter_t *counter)
+{
+ size_t val;
+ tor_mutex_acquire(&counter->mutex);
+ val = counter->val;
+ tor_mutex_release(&counter->mutex);
+ return val;
+}