summaryrefslogtreecommitdiff
path: root/debian/patches/fix-locking0003-yyy-kern-improve-simple-lock-debugging.patch
blob: 34e68a21407e954ff8961a66788ae22fa5c7ce0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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