summaryrefslogtreecommitdiff
path: root/debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch')
-rw-r--r--debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch123
1 files changed, 123 insertions, 0 deletions
diff --git a/debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch b/debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch
new file mode 100644
index 0000000..34e68a2
--- /dev/null
+++ b/debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch
@@ -0,0 +1,123 @@
+From 5234d0abfa3cb0cc62a1b797a26b8c250d8441e2 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 15 Aug 2015 17:04:08 +0200
+Subject: [PATCH gnumach 03/12] yyy kern: improve simple lock debugging
+
+* kern/lock.c
+* kern/lock.h
+---
+ kern/lock.c | 32 +++++++++++++++++---------------
+ kern/lock.h | 15 +++++++++++++--
+ 2 files changed, 30 insertions(+), 17 deletions(-)
+
+diff --git a/kern/lock.c b/kern/lock.c
+index d894b06..de22795 100644
+--- a/kern/lock.c
++++ b/kern/lock.c
+@@ -133,7 +133,8 @@ unsigned int simple_locks_taken = 0;
+
+ struct simple_locks_info {
+ simple_lock_t l;
+- void *ra;
++ const char *expr;
++ const char *loc;
+ } simple_locks_info[NSLINFO];
+
+ int do_check_simple_locks = 1;
+@@ -162,8 +163,10 @@ void simple_lock_init(
+ l->lock_data = 0;
+ }
+
+-void simple_lock(
+- simple_lock_t l)
++void _simple_lock(
++ simple_lock_t l,
++ const char *expression,
++ const char *location)
+ {
+ struct simple_locks_info *info;
+
+@@ -173,12 +176,14 @@ void simple_lock(
+
+ info = &simple_locks_info[simple_locks_taken++];
+ info->l = l;
+- info->ra =
+- __builtin_extract_return_addr (__builtin_return_address (0));
++ info->expr = expression;
++ info->loc = location;
+ }
+
+-boolean_t simple_lock_try(
+- simple_lock_t l)
++boolean_t _simple_lock_try(
++ simple_lock_t l,
++ const char *expression,
++ const char *location)
+ {
+ struct simple_locks_info *info;
+
+@@ -189,8 +194,8 @@ boolean_t simple_lock_try(
+
+ info = &simple_locks_info[simple_locks_taken++];
+ info->l = l;
+- info->ra =
+- __builtin_extract_return_addr (__builtin_return_address (0));
++ info->expr = expression;
++ info->loc = location;
+
+ return TRUE;
+ }
+@@ -214,6 +219,7 @@ void simple_unlock(
+
+ simple_locks_info[i] = simple_locks_info[simple_locks_taken-1];
+ }
++ simple_locks_info[simple_locks_taken] = (struct simple_locks_info) {0};
+ simple_locks_taken--;
+ }
+
+@@ -628,13 +634,9 @@ void db_show_all_slocks(void)
+
+ for (i = 0; i < simple_locks_taken; i++) {
+ info = &simple_locks_info[i];
+- db_printf("%d: ", i);
++ db_printf("%d: %s (", i, info->expr);
+ db_printsym(info->l, DB_STGY_ANY);
+-#if defined(__i386__)
+- db_printf(" locked by ");
+- db_printsym(info->ra, DB_STGY_PROC);
+-#endif
+- db_printf("\n");
++ db_printf(") locked by %s\n", info->loc);
+ }
+ }
+ #else /* MACH_SLOCKS && NCPUS == 1 */
+diff --git a/kern/lock.h b/kern/lock.h
+index 0eba0ad..e88e182 100644
+--- a/kern/lock.h
++++ b/kern/lock.h
+@@ -90,9 +90,20 @@ class simple_lock_data_t name;
+ */
+
+ extern void simple_lock_init(simple_lock_t);
+-extern void simple_lock(simple_lock_t);
++extern void _simple_lock(simple_lock_t,
++ const char *, const char *);
+ extern void simple_unlock(simple_lock_t);
+-extern boolean_t simple_lock_try(simple_lock_t);
++extern boolean_t _simple_lock_try(simple_lock_t,
++ const char *, const char *);
++
++/* We provide simple_lock and simple_lock_try so that we can save the
++ location. */
++#define XSTR(x) #x
++#define STR(x) XSTR(x)
++#define LOCATION __FILE__ ":" STR(__LINE__)
++
++#define simple_lock(lock) _simple_lock((lock), #lock, LOCATION)
++#define simple_lock_try(lock) _simple_lock_try((lock), #lock, LOCATION)
+
+ #define simple_lock_pause()
+ #define simple_lock_taken(lock) (simple_lock_assert(lock), \
+--
+2.1.4
+