From: Paul Gofman <pgofman(a)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; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1339