Module: wine Branch: refs/heads/master Commit: 0b39d1a89e00afec9d13adcad74df44ac2027102 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0b39d1a89e00afec9d13adca...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jul 24 13:59:10 2006 +0200
libwine: Added a function to enumerate the reserved mmap areas.
---
include/wine/library.h | 2 ++ libs/wine/mmap.c | 35 +++++++++++++++++++++++++++++++++++ libs/wine/wine.def | 1 + libs/wine/wine.map | 1 + 4 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/include/wine/library.h b/include/wine/library.h index c593bd2..cbaa026 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -75,6 +75,8 @@ extern void *wine_anon_mmap( void *start extern void wine_mmap_add_reserved_area( void *addr, size_t size ); extern void wine_mmap_remove_reserved_area( void *addr, size_t size, int unmap ); extern int wine_mmap_is_in_reserved_area( void *addr, size_t size ); +extern int wine_mmap_enum_reserved_areas( int (*enum_func)(void *base, size_t size, void *arg), + void *arg, int top_down );
/* LDT management */
diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index 16bf302..a8654dc 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -539,3 +539,38 @@ int wine_mmap_is_in_reserved_area( void } return 0; } + + +/*********************************************************************** + * wine_mmap_enum_reserved_areas + * + * Enumerate the list of reserved areas, sorted by addresses. + * If enum_func returns a non-zero value, enumeration is stopped and the value is returned. + * + * Note: the reserved areas functions are not reentrant, caller is + * responsible for proper locking. + */ +int wine_mmap_enum_reserved_areas( int (*enum_func)(void *base, size_t size, void *arg), void *arg, + int top_down ) +{ + int ret = 0; + struct list *ptr; + + if (top_down) + { + for (ptr = reserved_areas.prev; ptr != &reserved_areas; ptr = ptr->prev) + { + struct reserved_area *area = LIST_ENTRY( ptr, struct reserved_area, entry ); + if ((ret = enum_func( area->base, area->size, arg ))) break; + } + } + else + { + for (ptr = reserved_areas.next; ptr != &reserved_areas; ptr = ptr->next) + { + struct reserved_area *area = LIST_ENTRY( ptr, struct reserved_area, entry ); + if ((ret = enum_func( area->base, area->size, arg ))) break; + } + } + return ret; +} diff --git a/libs/wine/wine.def b/libs/wine/wine.def index 6fe8ade..462a619 100644 --- a/libs/wine/wine.def +++ b/libs/wine/wine.def @@ -103,6 +103,7 @@ EXPORTS wine_ldt_realloc_entries wine_ldt_set_entry wine_mmap_add_reserved_area + wine_mmap_enum_reserved_areas wine_mmap_is_in_reserved_area wine_mmap_remove_reserved_area wine_pthread_get_functions diff --git a/libs/wine/wine.map b/libs/wine/wine.map index 84e4e5d..47e58ce 100644 --- a/libs/wine/wine.map +++ b/libs/wine/wine.map @@ -103,6 +103,7 @@ WINE_1.0 wine_ldt_realloc_entries; wine_ldt_set_entry; wine_mmap_add_reserved_area; + wine_mmap_enum_reserved_areas; wine_mmap_is_in_reserved_area; wine_mmap_remove_reserved_area; wine_pthread_get_functions;