summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_mutex.c
diff options
context:
space:
mode:
authorvisa <visa@openbsd.org>2017-04-20 13:57:29 +0000
committervisa <visa@openbsd.org>2017-04-20 13:57:29 +0000
commitc4925651028d655edda3c8b85b8d1b4a0cda6fb9 (patch)
tree39641d1c0ea82ca4643b96a15dc6a3d9c3a25f4c /sys/kern/kern_mutex.c
parentHook up rwlock(9) to witness(4). (diff)
downloadwireguard-openbsd-c4925651028d655edda3c8b85b8d1b4a0cda6fb9.tar.xz
wireguard-openbsd-c4925651028d655edda3c8b85b8d1b4a0cda6fb9.zip
Hook up mutex(9) to witness(4).
Diffstat (limited to 'sys/kern/kern_mutex.c')
-rw-r--r--sys/kern/kern_mutex.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c
new file mode 100644
index 00000000000..6ede70b2d80
--- /dev/null
+++ b/sys/kern/kern_mutex.c
@@ -0,0 +1,69 @@
+/* $OpenBSD: kern_mutex.c,v 1.1 2017/04/20 13:57:30 visa Exp $ */
+
+/*
+ * Copyright (c) 2017 Visa Hankala
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/mutex.h>
+#include <sys/witness.h>
+
+void
+_mtx_init_flags(struct mutex *m, int ipl, const char *name, int flags,
+ struct lock_type *type)
+{
+ struct lock_object *lo = MUTEX_LOCK_OBJECT(m);
+
+ lo->lo_flags = MTX_LO_FLAGS(flags);
+ if (name != NULL)
+ lo->lo_name = name;
+ else
+ lo->lo_name = type->lt_name;
+ WITNESS_INIT(lo, type);
+
+ _mtx_init(m, ipl);
+}
+
+void
+_mtx_enter(struct mutex *m, const char *file, int line)
+{
+ struct lock_object *lo = MUTEX_LOCK_OBJECT(m);
+
+ WITNESS_CHECKORDER(lo, LOP_EXCLUSIVE | LOP_NEWORDER, file, line, NULL);
+ __mtx_enter(m);
+ WITNESS_LOCK(lo, LOP_EXCLUSIVE, file, line);
+}
+
+int
+_mtx_enter_try(struct mutex *m, const char *file, int line)
+{
+ struct lock_object *lo = MUTEX_LOCK_OBJECT(m);
+
+ if (__mtx_enter_try(m)) {
+ WITNESS_LOCK(lo, LOP_EXCLUSIVE, file, line);
+ return 1;
+ }
+ return 0;
+}
+
+void
+_mtx_leave(struct mutex *m, const char *file, int line)
+{
+ struct lock_object *lo = MUTEX_LOCK_OBJECT(m);
+
+ WITNESS_UNLOCK(lo, LOP_EXCLUSIVE, file, line);
+ __mtx_leave(m);
+}