From 063a092f93f0609ef1d026f59da6afbc3723e101 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 4 Jul 2008 15:20:43 +0000 Subject: [PATCH] Test to quickly reproduce bug #2471. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26247 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/tests/system/kernel/Jamfile | 2 + .../kernel/page_fault_cache_merge_test.cpp | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/tests/system/kernel/page_fault_cache_merge_test.cpp diff --git a/src/tests/system/kernel/Jamfile b/src/tests/system/kernel/Jamfile index d068327247..4caaf25ffb 100644 --- a/src/tests/system/kernel/Jamfile +++ b/src/tests/system/kernel/Jamfile @@ -15,6 +15,8 @@ SimpleTest lock_node_test : : be ; +SimpleTest page_fault_cache_merge_test : page_fault_cache_merge_test.cpp ; + SimpleTest port_close_test_1 : port_close_test_1.cpp ; SimpleTest port_close_test_2 : port_close_test_2.cpp ; diff --git a/src/tests/system/kernel/page_fault_cache_merge_test.cpp b/src/tests/system/kernel/page_fault_cache_merge_test.cpp new file mode 100644 index 0000000000..2d339cc973 --- /dev/null +++ b/src/tests/system/kernel/page_fault_cache_merge_test.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include + +#include + + +static const int kAreaPagesCount = 4 * 1024; // 16 MB + + +int +main() +{ + while (true) { + uint8* address; + area_id area = create_area("test area", (void**)&address, B_ANY_ADDRESS, + kAreaPagesCount * B_PAGE_SIZE, B_NO_LOCK, + B_READ_AREA | B_WRITE_AREA); + if (area < 0) { + fprintf(stderr, "Creating the area failed: %s", strerror(area)); + exit(1); + } + + // touch half of the pages + for (int i = 0; i < kAreaPagesCount / 2; i++) + address[i * B_PAGE_SIZE] = 42; + + // fork + pid_t child = fork(); + if (child < 0) { + perror("fork() failed"); + exit(1); + } + + if (child == 0) { + // child + + // delete the copied area + delete_area(area_for(address)); + + exit(0); + } + + // parent + + // touch the other half of the pages + for (int i = kAreaPagesCount / 2; i < kAreaPagesCount; i++) + address[i * B_PAGE_SIZE] = 42; + + int status; + while (wait(&status) != child); + + delete_area(area); + } + + return 0; +}