From dff4e90c797f2225e4403b63067d62f546346f4a Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sun, 16 Aug 2015 14:07:00 +0200 Subject: [PATCH gnumach 05/12] fu_locking issues --- vm/vm_object.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/vm/vm_object.c b/vm/vm_object.c index 94fa48f..02f0ade 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -545,6 +545,12 @@ void vm_object_terminate( { vm_page_t p; vm_object_t shadow_object; + memory_object_t pager; + memory_object_control_t pager_request; + memory_object_name_t pager_name; +#if MACH_PAGEMAP + vm_external_t existence_info; +#endif /* MACH_PAGEMAP */ /* * Make sure the object isn't already being terminated @@ -642,20 +648,26 @@ void vm_object_terminate( * using memory_object_terminate. */ + /* Copy attributes while object is locked. */ + pager = object->pager; + pager_request = object->pager_request; + pager_name = object->pager_name; +#if MACH_PAGEMAP + existence_info = object->existence_info; +#endif /* MACH_PAGEMAP */ + vm_object_unlock(object); - if (object->pager != IP_NULL) { + if (pager != IP_NULL) { /* consumes our rights for pager, pager_request, pager_name */ - memory_object_release(object->pager, - object->pager_request, - object->pager_name); - } else if (object->pager_name != IP_NULL) { + memory_object_release(pager, pager_request, pager_name); + } else if (pager_name != IP_NULL) { /* consumes our right for pager_name */ - ipc_port_dealloc_kernel(object->pager_name); + ipc_port_dealloc_kernel(pager_name); } #if MACH_PAGEMAP - vm_external_destroy(object->existence_info); + vm_external_destroy(existence_info); #endif /* MACH_PAGEMAP */ /* -- 2.1.4