Simplify memory manager code

This commit is contained in:
Justine Tunney 2024-12-28 17:08:18 -08:00
parent 379cd77078
commit aca4214ff6
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
11 changed files with 442 additions and 325 deletions

View file

@ -534,35 +534,31 @@ void BenchMmapPrivate(void) {
void *p;
p = mmap(0, (sizes[count] = rand() % (pagesz * 500)), PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (p == MAP_FAILED)
__builtin_trap();
ASSERT_NE(MAP_FAILED, p);
ptrs[count] = p;
++count;
}
void BenchUnmap(void) {
--count;
if (munmap(ptrs[count], sizes[count]))
__builtin_trap();
ASSERT_SYS(0, 0, munmap(ptrs[count], sizes[count]));
}
void BenchBigMmap(void) {
void *p;
p = mmap(0, 101 * 1024 * 1024, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (p == MAP_FAILED)
__builtin_trap();
ASSERT_NE(MAP_FAILED, p);
ptrs[count++] = p;
}
void BenchBigMunmap(void) {
if (munmap(ptrs[--count], 101 * 1024 * 1024))
__builtin_trap();
ASSERT_SYS(0, 0, munmap(ptrs[--count], 101 * 1024 * 1024));
}
TEST(mmap, bench) {
BENCHMARK(N, 1, BenchMmapPrivate());
BENCHMARK(N, 1, BenchUnmap());
// BENCHMARK(N, 1, BenchBigMmap());
// BENCHMARK(N, 1, BenchBigMunmap());
/* BENCHMARK(N, 1, BenchBigMmap()); */
/* BENCHMARK(N, 1, BenchBigMunmap()); */
}

View file

@ -53,26 +53,106 @@ TEST(munmap, test) {
EXPECT_FALSE(testlib_memoryexists(p));
}
TEST(munmap, carveMemory) {
if (IsWindows())
return; // needs carving
char *p;
int count = __maps.count;
ASSERT_NE(MAP_FAILED,
(p = mmap(__maps_randaddr(), gransz * 3, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)));
EXPECT_EQ(count + 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(p + gransz * 0));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 2));
EXPECT_SYS(0, 0, munmap(p + gransz * 0, gransz));
EXPECT_EQ(count + 0, __maps.count);
count = __maps.count;
EXPECT_FALSE(testlib_memoryexists(p + gransz * 0));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 2));
EXPECT_SYS(0, 0, munmap(p + gransz * 2, gransz));
EXPECT_EQ(count + 0, __maps.count);
count = __maps.count;
EXPECT_FALSE(testlib_memoryexists(p + gransz * 0));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 1));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 2));
EXPECT_SYS(0, 0, munmap(p + gransz * 1, gransz));
EXPECT_EQ(count - 1, __maps.count);
count = __maps.count;
EXPECT_FALSE(testlib_memoryexists(p + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 1));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 2));
}
TEST(munmap, punchHoleInMemory) {
if (IsWindows())
return; // needs carving
char *p;
ASSERT_NE(MAP_FAILED, (p = mmap(0, gransz * 3, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)));
int count = __maps.count;
ASSERT_NE(MAP_FAILED,
(p = mmap(__maps_randaddr(), gransz * 3, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)));
EXPECT_EQ(count + 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(p + gransz * 0));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 2));
EXPECT_SYS(0, 0, munmap(p + gransz, gransz));
EXPECT_EQ(count + 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(p + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(p + gransz * 2));
EXPECT_SYS(0, 0, munmap(p, gransz));
EXPECT_EQ(count - 1, __maps.count);
count = __maps.count;
EXPECT_SYS(0, 0, munmap(p + gransz * 2, gransz));
EXPECT_EQ(count - 1, __maps.count);
count = __maps.count;
EXPECT_FALSE(testlib_memoryexists(p + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 1));
EXPECT_FALSE(testlib_memoryexists(p + gransz * 2));
}
TEST(munmap, fillHoleInMemory) {
if (IsWindows())
return; // needs fungible memory
int count = __maps.count;
char *base = __maps_randaddr();
EXPECT_EQ(base + gransz * 0,
mmap(base + gransz * 0, gransz, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
EXPECT_EQ(count + 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(base + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(base + gransz * 1));
EXPECT_FALSE(testlib_memoryexists(base + gransz * 2));
EXPECT_EQ(base + gransz * 2,
mmap(base + gransz * 2, gransz, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
EXPECT_EQ(count + 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(base + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(base + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(base + gransz * 2));
EXPECT_EQ(base + gransz * 1,
mmap(base + gransz * 1, gransz, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
EXPECT_EQ(count - 1, __maps.count);
count = __maps.count;
EXPECT_TRUE(testlib_memoryexists(base + gransz * 0));
EXPECT_TRUE(testlib_memoryexists(base + gransz * 1));
EXPECT_TRUE(testlib_memoryexists(base + gransz * 2));
EXPECT_SYS(0, 0, munmap(base, gransz * 3));
EXPECT_EQ(count - 1, __maps.count);
count = __maps.count;
EXPECT_FALSE(testlib_memoryexists(base + gransz * 0));
EXPECT_FALSE(testlib_memoryexists(base + gransz * 1));
EXPECT_FALSE(testlib_memoryexists(base + gransz * 2));
}
TEST(munmap, memoryHasHole) {
if (IsWindows())
return; // needs carving