summaryrefslogtreecommitdiff
path: root/kern/syscnt.h
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2018-02-06 20:35:30 +0100
committerRichard Braun <rbraun@sceen.net>2018-02-07 01:08:53 +0100
commitc302412778d43f1ed6223349911013d43eadfdcd (patch)
treefb2bc13f0ab076b71be0771feb7794f28bdee103 /kern/syscnt.h
parent9d02354096ece1c4e0c91109a377d62f65f87b0e (diff)
kern/syscnt: new syscnt_set method
Diffstat (limited to 'kern/syscnt.h')
-rw-r--r--kern/syscnt.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/kern/syscnt.h b/kern/syscnt.h
index 2200456..fb00b75 100644
--- a/kern/syscnt.h
+++ b/kern/syscnt.h
@@ -53,6 +53,12 @@ void syscnt_register(struct syscnt *syscnt, const char *name);
#ifdef ATOMIC_HAVE_64B_OPS
static inline void
+syscnt_set(struct syscnt *syscnt, uint64_t value)
+{
+ atomic_store(&syscnt->value, value, ATOMIC_RELAXED);
+}
+
+static inline void
syscnt_add(struct syscnt *syscnt, int64_t delta)
{
atomic_add(&syscnt->value, delta, ATOMIC_RELAXED);
@@ -67,6 +73,16 @@ syscnt_read(const struct syscnt *syscnt)
#else /* ATOMIC_HAVE_64B_OPS */
static inline void
+syscnt_set(struct syscnt *syscnt, uint64_t value)
+{
+ unsigned long flags;
+
+ spinlock_lock_intr_save(&syscnt->lock, &flags);
+ syscnt->value = value;
+ spinlock_unlock_intr_restore(&syscnt->lock, flags);
+}
+
+static inline void
syscnt_add(struct syscnt *syscnt, int64_t delta)
{
unsigned long flags;