ntdll: Better match Windows subheap sizes.

This commit is contained in:
Paul Gofman 2023-05-11 21:53:02 -06:00 committed by Alexandre Julliard
parent 76fc73f311
commit 354a8bb1f4
2 changed files with 11 additions and 10 deletions

View file

@ -578,7 +578,6 @@ static void test_HeapCreate(void)
todo_wine
ok( entries[0].Region.dwCommittedSize == 0x400 * sizeof(void *),
"got Region.dwCommittedSize %#lx\n", entries[0].Region.dwCommittedSize );
todo_wine
ok( entries[0].Region.dwUnCommittedSize == 0x10000 - entries[0].Region.dwCommittedSize ||
entries[0].Region.dwUnCommittedSize == 0x10000 * sizeof(void *) - entries[0].Region.dwCommittedSize /* win7 */,
"got Region.dwUnCommittedSize %#lx\n", entries[0].Region.dwUnCommittedSize );
@ -3019,9 +3018,9 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags
expect_size = max( alloc_size, 2 * sizeof(void *) );
expect_size = ALIGN_BLOCK_SIZE( expect_size + extra_size );
diff = min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) );
todo_wine_if( (!(global_flags & ~FLG_HEAP_ENABLE_FREE_CHECK) && alloc_size < 2 * sizeof(void *)) )
todo_wine_if( (!global_flags && alloc_size < 2 * sizeof(void *)) ||
((heap_flags & HEAP_FREE_CHECKING_ENABLED) && diff >= 0x100000) )
ok( diff == expect_size, "got diff %#Ix exp %#Ix\n", diff, expect_size );
ok( !memcmp( ptr0 + alloc_size, tail_buf, tail_size ), "missing block tail\n" );
ok( !memcmp( ptr1 + alloc_size, tail_buf, tail_size ), "missing block tail\n" );
ok( !memcmp( ptr2 + alloc_size, tail_buf, tail_size ), "missing block tail\n" );
@ -3661,7 +3660,6 @@ static void test_heap_size( SIZE_T initial_size )
heap = HeapCreate( HEAP_NO_SERIALIZE, initial_size, 0 );
get_valloc_info( heap, &current_base, &alloc_size );
todo_wine
ok( alloc_size == initial_size + default_heap_size || broken( (initial_size && alloc_size == initial_size)
|| (!initial_size && (alloc_size == default_heap_size * sizeof(void*))) ) /* Win7 */,
"got %#Ix.\n", alloc_size );
@ -3687,11 +3685,9 @@ static void test_heap_size( SIZE_T initial_size )
max_size_reached = TRUE;
}
}
todo_wine_if( !initial_subheap )
ok( alloc_size == current_subheap_size, "got %#Ix.\n", alloc_size );
winetest_pop_context();
}
todo_wine_if( sizeof(void *) == 8 )
ok( max_size_reached, "Did not reach maximum subheap size.\n" );
HeapDestroy( heap );

View file

@ -311,7 +311,12 @@ C_ASSERT( offsetof(struct heap, subheap) <= REGION_ALIGN - 1 );
#define HEAP_MAGIC ((DWORD)('H' | ('E'<<8) | ('A'<<16) | ('P'<<24)))
#define HEAP_DEF_SIZE (0x40000 * BLOCK_ALIGN)
#define HEAP_INITIAL_SIZE 0x10000
#define HEAP_INITIAL_GROW_SIZE 0x100000
#define HEAP_MAX_GROW_SIZE 0xfd0000
C_ASSERT( HEAP_MIN_LARGE_BLOCK_SIZE <= HEAP_INITIAL_GROW_SIZE );
#define MAX_FREE_PENDING 1024 /* max number of free requests to delay */
/* some undocumented flags (names are made up) */
@ -1133,7 +1138,7 @@ static struct block *find_free_block( struct heap *heap, ULONG flags, SIZE_T blo
if ((subheap = create_subheap( heap, flags, max( heap->grow_size, total_size ), total_size )))
{
if (heap->grow_size <= HEAP_MAX_FREE_BLOCK_SIZE / 2) heap->grow_size *= 2;
heap->grow_size = min( heap->grow_size * 2, HEAP_MAX_GROW_SIZE );
}
else while (!subheap) /* shrink the grow size again if we are running out of space */
{
@ -1517,7 +1522,7 @@ HANDLE WINAPI RtlCreateHeap( ULONG flags, void *addr, SIZE_T total_size, SIZE_T
flags &= ~(HEAP_TAIL_CHECKING_ENABLED|HEAP_FREE_CHECKING_ENABLED);
if (process_heap) flags |= HEAP_PRIVATE;
if (!process_heap || !total_size || (flags & HEAP_SHARED)) flags |= HEAP_GROWABLE;
if (!total_size) total_size = HEAP_DEF_SIZE;
if (!total_size) total_size = commit_size + HEAP_INITIAL_SIZE;
if (!(heap = addr))
{
@ -1532,7 +1537,7 @@ HANDLE WINAPI RtlCreateHeap( ULONG flags, void *addr, SIZE_T total_size, SIZE_T
heap->flags = (flags & ~HEAP_SHARED);
heap->compat_info = HEAP_STD;
heap->magic = HEAP_MAGIC;
heap->grow_size = max( HEAP_DEF_SIZE, total_size );
heap->grow_size = HEAP_INITIAL_GROW_SIZE;
heap->min_size = commit_size;
list_init( &heap->subheap_list );
list_init( &heap->large_list );