From 4b6cb4f5ad20f85554f8aab4f5acfb5a979980a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 15 Oct 2009 09:30:48 +0000 Subject: [PATCH] * Added test application that easily reproduces bug #4778. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33593 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/tests/system/kernel/Jamfile | 4 +- .../system/kernel/reserved_areas_test.cpp | 88 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/tests/system/kernel/reserved_areas_test.cpp diff --git a/src/tests/system/kernel/Jamfile b/src/tests/system/kernel/Jamfile index 658e921323..6bc4759d09 100644 --- a/src/tests/system/kernel/Jamfile +++ b/src/tests/system/kernel/Jamfile @@ -35,6 +35,8 @@ SimpleTest port_wakeup_test_7 : port_wakeup_test_7.cpp ; SimpleTest port_wakeup_test_8 : port_wakeup_test_8.cpp ; SimpleTest port_wakeup_test_9 : port_wakeup_test_9.cpp ; +SimpleTest reserved_areas_test : reserved_areas_test.cpp ; + SimpleTest select_check : select_check.cpp ; SimpleTest select_close_test : select_close_test.cpp ; @@ -42,7 +44,7 @@ SimpleTest sem_acquire_test1 : sem_acquire_test1.cpp : be ; SimpleTest spinlock_contention : spinlock_contention.cpp ; -SimpleTest syscall_restart_test : syscall_restart_test.cpp +SimpleTest syscall_restart_test : syscall_restart_test.cpp : network $(TARGET_LIBSUPC++) ; SetSupportedPlatformsForTarget syscall_time diff --git a/src/tests/system/kernel/reserved_areas_test.cpp b/src/tests/system/kernel/reserved_areas_test.cpp new file mode 100644 index 0000000000..b569b805ba --- /dev/null +++ b/src/tests/system/kernel/reserved_areas_test.cpp @@ -0,0 +1,88 @@ +//! Test application that reproduces bug #4778. + + +#include +#include +#include + +#include + +#include + + +status_t +memory_eater(void*) +{ + size_t total = 0; + + while (true) { + size_t size = rand() % 16384 + 8; + if (malloc(size) == NULL) { + printf("out of memory after having allocated %ld bytes\n", total); + break; + } else + total += size; + + putchar('.'); + } + + return B_OK; +} + + +status_t +area_creator(void*) +{ + while (true) { + status_t status = B_ERROR; + uint32 addressSpec = B_ANY_ADDRESS; + void* base; + bool readOnly = false;//(rand() % 256) > 127; + if (!readOnly) { + // reserve 128 MB of space for the area + base = (void*)0x60000000; + status = _kern_reserve_address_range((addr_t*)&base, B_BASE_ADDRESS, + 128 * 1024 * 1024); + if (status != B_OK) + snooze(10000000LL); + addressSpec = status == B_OK ? B_EXACT_ADDRESS : B_BASE_ADDRESS; +printf("\naddress spec = %lx, base %p (status %s)\n", addressSpec, base, strerror(status)); + } + + area_id area = create_area(readOnly ? "read-only memory" : "r/w memory", + &base, addressSpec, B_PAGE_SIZE * 4, B_NO_LOCK, + B_READ_AREA | (readOnly ? 0 : B_WRITE_AREA)); + if (area >= 0) { +printf("new %s area %ld at %p\n", readOnly ? "read-only" : "r/w", area, base); +// putchar('#'); + } else + break; + + snooze(10000); + } + + return B_OK; +} + + +int +main(int argc, char** argv) +{ + thread_id eater = spawn_thread(&memory_eater, "memory eater", + B_NORMAL_PRIORITY, NULL); + resume_thread(eater); + + thread_id creator = spawn_thread(&area_creator, "area creator", + B_NORMAL_PRIORITY, NULL); + resume_thread(creator); + + object_wait_info waitInfos[2] = { + { eater, B_OBJECT_TYPE_THREAD, 0 }, + { creator, B_OBJECT_TYPE_THREAD, 0 } + }; + ssize_t which = wait_for_objects(waitInfos, 2); + printf("wait for objects: %ld\n", which); + + debugger("Welcome to the land of tomorrow"); + return 0; +}