forked from Bananymous/banan-os
mmap-shared-test: Add test case for msync
This commit is contained in:
parent
60e755210c
commit
4c3da66c92
|
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue