mmap-shared-test: Add test case for msync

This commit is contained in:
Bananymous 2023-11-22 22:45:16 +02:00
parent 60e755210c
commit 4c3da66c92
1 changed files with 92 additions and 10 deletions

View File

@ -30,12 +30,10 @@ int prepare_file()
free(null_buffer); free(null_buffer);
close(fd); close(fd);
printf("file created\n");
return 0; return 0;
} }
int job1() int test1_job1()
{ {
int fd = open(FILE_NAME, O_RDONLY); int fd = open(FILE_NAME, O_RDONLY);
if (fd == -1) if (fd == -1)
@ -60,12 +58,12 @@ int job1()
munmap(addr, FILE_SIZE); munmap(addr, FILE_SIZE);
close(fd); close(fd);
printf("sum: %zu\n", sum); printf("got: %zu\n", sum);
return 0; exit(0);
} }
int job2() int test1_job2()
{ {
sleep(2); sleep(2);
@ -93,14 +91,14 @@ int job2()
return 0; return 0;
} }
int main() int test1()
{ {
if (int ret = prepare_file()) if (int ret = prepare_file())
return ret; return ret;
pid_t pid = fork(); pid_t pid = fork();
if (pid == 0) if (pid == 0)
return job1(); return test1_job1();
if (pid == -1) if (pid == -1)
{ {
@ -108,8 +106,92 @@ int main()
return 1; return 1;
} }
int ret = job2(); int ret = test1_job2();
waitpid(pid, nullptr, 0); waitpid(pid, nullptr, 0);
return ret; return ret;
} }
int test2_job1()
{
sleep(2);
int fd = open(FILE_NAME, O_RDWR);
if (fd == -1)
{
perror("open");
return 1;
}
size_t value = 0;
if (read(fd, &value, sizeof(size_t)) == -1)
{
perror("read");
return 1;
}
printf("got: %zu\n", value);
close(fd);
exit(0);
}
int test2_job2()
{
int fd = open(FILE_NAME, O_RDWR);
if (fd == -1)
{
perror("open");
return 1;
}
void* addr = mmap(nullptr, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (addr == MAP_FAILED)
{
perror("mmap");
return 1;
}
*(size_t*)addr = 0x123456789;
if (msync(addr, sizeof(size_t), MS_SYNC) == -1)
{
perror("msync");
return 1;
}
printf("expecting: %zu\n", *(size_t*)addr);
sleep(4);
munmap(addr, FILE_SIZE);
close(fd);
return 0;
}
int test2()
{
if (int ret = prepare_file())
return ret;
pid_t pid = fork();
if (pid == 0)
return test2_job1();
if (pid == -1)
{
perror("fork");
return 1;
}
int ret = test2_job2();
waitpid(pid, nullptr, 0);
return ret;
}
int main()
{
test1();
test2();
}