summaryrefslogtreecommitdiff
path: root/usr/src/compat/bhyve/pthread.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/compat/bhyve/pthread.h')
-rw-r--r--usr/src/compat/bhyve/pthread.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/usr/src/compat/bhyve/pthread.h b/usr/src/compat/bhyve/pthread.h
new file mode 100644
index 0000000000..de975971b5
--- /dev/null
+++ b/usr/src/compat/bhyve/pthread.h
@@ -0,0 +1,61 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
+ */
+
+#ifndef _COMPAT_FREEBSD_PTHREAD_H_
+#define _COMPAT_FREEBSD_PTHREAD_H_
+
+#include <sys/debug.h>
+#include_next <pthread.h>
+
+/*
+ * Mutexes on FreeBSD are error-checking by default. Wrap pthread_mutex_*()
+ * to deliver the same, and check for errors.
+ */
+
+#undef PTHREAD_MUTEX_INITIALIZER
+#define PTHREAD_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+
+static __inline int
+checked_pthread_mutex_init(pthread_mutex_t *restrict mutex,
+ const pthread_mutexattr_t *restrict cattr)
+{
+ if (cattr != NULL) {
+ VERIFY0(pthread_mutex_init(mutex, cattr));
+ } else {
+ pthread_mutexattr_t attr = { 0 };
+
+ VERIFY0(pthread_mutexattr_init(&attr));
+ VERIFY0(pthread_mutexattr_settype(&attr,
+ PTHREAD_MUTEX_ERRORCHECK));
+ VERIFY0(pthread_mutex_init(mutex, &attr));
+ VERIFY0(pthread_mutexattr_destroy(&attr));
+ }
+
+ return (0);
+}
+
+static __inline int
+checked_pthread_mutex_destroy(pthread_mutex_t *mutex)
+{
+ VERIFY0(pthread_mutex_destroy(mutex));
+ return (0);
+}
+
+#define pthread_mutex_init(m, a) checked_pthread_mutex_init(m, a)
+#define pthread_mutex_destroy(m) checked_pthread_mutex_destroy(m)
+#define pthread_mutex_lock(m) pthread_mutex_enter_np(m)
+#define pthread_mutex_unlock(m) pthread_mutex_exit_np(m)
+
+#endif /* _COMPAT_FREEBSD_PTHREAD_H_ */