From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/unix/virtual.c | 47 +++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 62f294e5070..506b8f0d72b 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -1519,6 +1519,31 @@ static struct file_view *alloc_view(void) }
+/*********************************************************************** + * free_view + * + * Free memory for view structure. virtual_mutex must be held by caller. + */ +static void free_view( struct file_view *view ) +{ + *(struct file_view **)view = next_free_view; + next_free_view = view; +} + + +/*********************************************************************** + * unregister_view + * + * Remove view from the tree and update free ranges. virtual_mutex must be held by caller. + */ +static void unregister_view( struct file_view *view ) +{ + if (mmap_is_in_reserved_area( view->base, view->size )) + free_ranges_remove_view( view ); + wine_rb_remove( &views_tree, &view->entry ); +} + + /*********************************************************************** * delete_view * @@ -1528,11 +1553,21 @@ static void delete_view( struct file_view *view ) /* [in] View */ { if (!(view->protect & VPROT_SYSTEM)) unmap_area( view->base, view->size ); set_page_vprot( view->base, view->size, 0 ); + unregister_view( view ); + free_view( view ); +} + + +/*********************************************************************** + * register_view + * + * Add view to the tree and update free ranges. virtual_mutex must be held by caller. + */ +static void register_view( struct file_view *view ) +{ + wine_rb_put( &views_tree, view->base, &view->entry ); if (mmap_is_in_reserved_area( view->base, view->size )) - free_ranges_remove_view( view ); - wine_rb_remove( &views_tree, &view->entry ); - *(struct file_view **)view = next_free_view; - next_free_view = view; + free_ranges_insert_view( view ); }
@@ -1576,9 +1611,7 @@ static NTSTATUS create_view( struct file_view **view_ret, void *base, size_t siz view->protect = vprot; set_page_vprot( base, size, vprot );
- wine_rb_put( &views_tree, view->base, &view->entry ); - if (mmap_is_in_reserved_area( view->base, view->size )) - free_ranges_insert_view( view ); + register_view( view );
*view_ret = view;