Don't rely on the reserved area list being empty in reserve_area,

since the preloader will need to add things to the list before
startup.
This commit is contained in:
Alexandre Julliard 2004-05-28 03:48:09 +00:00
parent f974c8598e
commit dc4d05690e
2 changed files with 4 additions and 26 deletions

View File

@ -266,6 +266,8 @@ static void add_reserved_area( void *addr, size_t size )
size -= (char *)USER_SPACE_LIMIT - (char *)addr; size -= (char *)USER_SPACE_LIMIT - (char *)addr;
addr = USER_SPACE_LIMIT; addr = USER_SPACE_LIMIT;
} }
/* blow away existing mappings */
wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
wine_mmap_add_reserved_area( addr, size ); wine_mmap_add_reserved_area( addr, size );
} }

View File

@ -201,32 +201,13 @@ static void reserve_area( void *addr, void *end )
{ {
void *ptr; void *ptr;
size_t size = (char *)end - (char *)addr; size_t size = (char *)end - (char *)addr;
struct list *prev;
struct reserved_area *area;
if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1) if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1)
{ {
if (ptr == addr) if (ptr == addr)
{ {
if (!end) size--; /* avoid wrap-around */ wine_mmap_add_reserved_area( addr, size );
/* try to merge it with the previous one */ return;
if ((prev = list_tail( &reserved_areas )))
{
area = LIST_ENTRY( prev, struct reserved_area, entry );
if (area && (char *)area->base + area->size == (char *)ptr)
{
area->size += size;
return;
}
}
/* create a new area */
if ((area = malloc( sizeof(*area) )))
{
area->base = addr;
area->size = size;
list_add_tail( &reserved_areas, &area->entry );
return;
}
} }
else munmap( ptr, size ); else munmap( ptr, size );
} }
@ -287,11 +268,6 @@ void wine_mmap_add_reserved_area( void *addr, size_t size )
if (!((char *)addr + size)) size--; /* avoid wrap-around */ if (!((char *)addr + size)) size--; /* avoid wrap-around */
#ifdef HAVE_MMAP
/* blow away existing mappings */
wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
#endif
LIST_FOR_EACH( ptr, &reserved_areas ) LIST_FOR_EACH( ptr, &reserved_areas )
{ {
area = LIST_ENTRY( ptr, struct reserved_area, entry ); area = LIST_ENTRY( ptr, struct reserved_area, entry );