summaryrefslogtreecommitdiff
path: root/debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch')
-rw-r--r--debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch b/debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch
new file mode 100644
index 0000000..2c6b731
--- /dev/null
+++ b/debian/patches/upstreamme0002-ipc-use-a-general-lock-to-protect-IPC-spaces.patch
@@ -0,0 +1,53 @@
+From 7c9b83c90e2acc4f9eb74713c47796a3c0a08800 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Wed, 15 Jul 2015 12:40:50 +0200
+Subject: [PATCH gnumach 2/2] ipc: use a general lock to protect IPC spaces
+
+This fixes a corruption in the radix trees representing the IPC spaces
+when memory was tight.
+
+* ipc/ipc_space.h: Use a general lock to protect IPC spaces.
+---
+ ipc/ipc_space.h | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/ipc/ipc_space.h b/ipc/ipc_space.h
+index bbfee46..73c90ef 100644
+--- a/ipc/ipc_space.h
++++ b/ipc/ipc_space.h
+@@ -62,7 +62,7 @@ struct ipc_space {
+ decl_simple_lock_data(,is_ref_lock_data)
+ ipc_space_refs_t is_references;
+
+- decl_simple_lock_data(,is_lock_data)
++ struct lock is_lock_data;
+ boolean_t is_active; /* is the space alive? */
+ struct rdxtree is_map; /* a map of entries */
+ size_t is_size; /* number of entries */
+@@ -107,16 +107,16 @@ MACRO_BEGIN \
+ is_free(is); \
+ MACRO_END
+
+-#define is_lock_init(is) simple_lock_init(&(is)->is_lock_data)
++#define is_lock_init(is) lock_init(&(is)->is_lock_data, TRUE)
+
+-#define is_read_lock(is) simple_lock(&(is)->is_lock_data)
+-#define is_read_unlock(is) simple_unlock(&(is)->is_lock_data)
++#define is_read_lock(is) lock_read(&(is)->is_lock_data)
++#define is_read_unlock(is) lock_done(&(is)->is_lock_data)
+
+-#define is_write_lock(is) simple_lock(&(is)->is_lock_data)
+-#define is_write_lock_try(is) simple_lock_try(&(is)->is_lock_data)
+-#define is_write_unlock(is) simple_unlock(&(is)->is_lock_data)
++#define is_write_lock(is) lock_write(&(is)->is_lock_data)
++#define is_write_lock_try(is) lock_try_write(&(is)->is_lock_data)
++#define is_write_unlock(is) lock_done(&(is)->is_lock_data)
+
+-#define is_write_to_read_lock(is)
++#define is_write_to_read_lock(is) lock_write_to_read(&(is)->is_lock_data)
+
+ extern void ipc_space_reference(struct ipc_space *space);
+ extern void ipc_space_release(struct ipc_space *space);
+--
+2.1.4
+