summaryrefslogtreecommitdiff
path: root/kern/lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'kern/lock.h')
-rw-r--r--kern/lock.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/kern/lock.h b/kern/lock.h
index 74cd933..c8af883 100644
--- a/kern/lock.h
+++ b/kern/lock.h
@@ -211,10 +211,21 @@ extern void lock_clear_recursive(lock_t);
#if ! MACH_LDEBUG
#define have_read_lock(l) 1
#define have_write_lock(l) 1
+#define lock_write_surrender(l)
+#define lock_write_steal(l)
#else /* MACH_LDEBUG */
/* XXX: We don't keep track of readers, so this is an approximation. */
#define have_read_lock(l) ((l)->read_count > 0)
#define have_write_lock(l) ((l)->writer == current_thread())
+#define THREAD_SURRENDERED ((thread_t) ~0U)
+#define lock_write_surrender(l) ({ \
+ assert(have_write_lock(l)); \
+ (l)->writer = THREAD_SURRENDERED; \
+ })
+#define lock_write_steal(l) ({ \
+ assert((l)->writer == THREAD_SURRENDERED); \
+ (l)->writer = current_thread(); \
+ })
#endif /* MACH_LDEBUG */
#define have_lock(l) (have_read_lock(l) || have_write_lock(l))