From c73b49b93e583d6fe9fdbfe18c540e0e3eaa6bd1 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sat, 25 Jul 2015 02:13:17 +0200 Subject: vm: use a general lock to protect the default memory manager * vm/memory_object.c: Use a general lock to protect the default memory manager. --- vm/memory_object.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'vm') diff --git a/vm/memory_object.c b/vm/memory_object.c index 097ed23..eeba168 100644 --- a/vm/memory_object.c +++ b/vm/memory_object.c @@ -73,8 +73,15 @@ typedef int memory_object_lock_result_t; /* moved from below */ ipc_port_t memory_manager_default = IP_NULL; -decl_simple_lock_data(,memory_manager_default_lock) +struct lock default_memory_manager_lock_data; + +#define default_memory_manager_lock_init() \ + lock_init(&default_memory_manager_lock_data, FALSE) +#define default_memory_manager_lock() \ + lock_write(&default_memory_manager_lock_data) +#define default_memory_manager_unlock() \ + lock_write_done(&default_memory_manager_lock_data) /* * Important note: * All of these routines gain a reference to the @@ -1033,7 +1040,7 @@ kern_return_t vm_set_default_memory_manager(host, default_manager) return(KERN_INVALID_HOST); new_manager = *default_manager; - simple_lock(&memory_manager_default_lock); + default_memory_manager_lock(); current_manager = memory_manager_default; if (new_manager == IP_NULL) { @@ -1060,7 +1067,7 @@ kern_return_t vm_set_default_memory_manager(host, default_manager) thread_wakeup((event_t) &memory_manager_default); } - simple_unlock(&memory_manager_default_lock); + default_memory_manager_unlock(); *default_manager = returned_manager; return(KERN_SUCCESS); @@ -1078,17 +1085,17 @@ ipc_port_t memory_manager_default_reference(void) { ipc_port_t current_manager; - simple_lock(&memory_manager_default_lock); + default_memory_manager_lock(); while (current_manager = ipc_port_copy_send(memory_manager_default), !IP_VALID(current_manager)) { - thread_sleep((event_t) &memory_manager_default, - simple_lock_addr(memory_manager_default_lock), + thread_sleep_lock((event_t) &memory_manager_default, + &default_memory_manager_lock_data, FALSE); - simple_lock(&memory_manager_default_lock); + default_memory_manager_lock(); } - simple_unlock(&memory_manager_default_lock); + default_memory_manager_unlock(); return current_manager; } @@ -1109,7 +1116,7 @@ boolean_t memory_manager_default_port(port) ipc_port_t current; boolean_t result; - simple_lock(&memory_manager_default_lock); + default_memory_manager_lock(); current = memory_manager_default; if (IP_VALID(current)) { /* @@ -1122,7 +1129,7 @@ boolean_t memory_manager_default_port(port) result = port->ip_receiver == current->ip_receiver; } else result = FALSE; - simple_unlock(&memory_manager_default_lock); + default_memory_manager_unlock(); return result; } @@ -1130,5 +1137,5 @@ boolean_t memory_manager_default_port(port) void memory_manager_default_init(void) { memory_manager_default = IP_NULL; - simple_lock_init(&memory_manager_default_lock); + default_memory_manager_lock_init(); } -- cgit v1.2.3