From 1534aa236c22d1ac86331d5d4ecca6290d273957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 15 Dec 2005 21:30:28 +0000 Subject: [PATCH] Added new function vm_low_memory_state() that returns the current low memory status. Added new B_NO_LOW_MEMORY constant for the usual case. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15551 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/vm_low_memory.h | 2 ++ src/system/kernel/vm/vm_low_memory.cpp | 40 +++++++++++++++++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/headers/private/kernel/vm_low_memory.h b/headers/private/kernel/vm_low_memory.h index fe7dfa459d..331e0f7df6 100644 --- a/headers/private/kernel/vm_low_memory.h +++ b/headers/private/kernel/vm_low_memory.h @@ -11,6 +11,7 @@ /* warning levels for low memory handlers */ enum { + B_NO_LOW_MEMORY = 0, B_LOW_MEMORY_NOTE, B_LOW_MEMORY_WARNING, B_LOW_MEMORY_CRITICAL, @@ -23,6 +24,7 @@ extern "C" { #endif status_t vm_low_memory_init(void); +int32 vm_low_memory_state(void); void vm_low_memory(size_t requirements); // these calls might get public some day diff --git a/src/system/kernel/vm/vm_low_memory.cpp b/src/system/kernel/vm/vm_low_memory.cpp index 6d653de120..2df4e69400 100644 --- a/src/system/kernel/vm/vm_low_memory.cpp +++ b/src/system/kernel/vm/vm_low_memory.cpp @@ -16,10 +16,13 @@ static const bigtime_t kLowMemoryInterval = 2000000; // 2 secs +// page limits static const size_t kNoteLimit = 1024; static const size_t kWarnLimit = 256; static const size_t kCriticalLimit = 32; +static int32 sLowMemoryState = B_NO_LOW_MEMORY; + struct low_memory_handler : public DoublyLinkedListLinkImpl { low_memory_func function; @@ -48,24 +51,34 @@ call_handlers(int32 level) } +static int32 +compute_state(void) +{ + uint32 freePages = vm_page_num_free_pages(); + if (freePages >= kNoteLimit) + return B_NO_LOW_MEMORY; + + // specify low memory level + if (freePages < kCriticalLimit) + return B_LOW_MEMORY_CRITICAL; + else if (freePages < kWarnLimit) + return B_LOW_MEMORY_WARNING; + + return B_LOW_MEMORY_NOTE; +} + + static int32 low_memory(void *) { while (true) { snooze(kLowMemoryInterval); - uint32 freePages = vm_page_num_free_pages(); - if (freePages >= kNoteLimit) + sLowMemoryState = compute_state(); + if (sLowMemoryState < B_LOW_MEMORY_NOTE) continue; - // specify low memory level - int32 level = B_LOW_MEMORY_NOTE; - if (freePages < kCriticalLimit) - level = B_LOW_MEMORY_CRITICAL; - else if (freePages < kWarnLimit) - level = B_LOW_MEMORY_WARNING; - - call_handlers(level); + call_handlers(sLowMemoryState); } return 0; } @@ -80,6 +93,13 @@ vm_low_memory(size_t requirements) } +int32 +vm_low_memory_state(void) +{ + return sLowMemoryState; +} + + status_t vm_low_memory_init(void) {