From: Dmitry Kurochkin Date: Mon, 18 Apr 2011 10:37:52 +0000 (+0400) Subject: Implement Ipc::Mem::Level(). X-Git-Tag: take06~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b940ff87f344951bf77bfd1cdfc7b2c0712a9233;p=thirdparty%2Fsquid.git Implement Ipc::Mem::Level(). --- diff --git a/src/ipc/AtomicWord.h b/src/ipc/AtomicWord.h index 5d30b7d27d..9d9080f502 100644 --- a/src/ipc/AtomicWord.h +++ b/src/ipc/AtomicWord.h @@ -27,7 +27,8 @@ public: bool operator ==(int v2) { return __sync_bool_compare_and_swap(&value, v2, value); } // TODO: no need for __sync_fetch_and_add here? - operator Value () const { return __sync_fetch_and_add(const_cast(&value), 0); } + Value get() const { return __sync_fetch_and_add(const_cast(&value), 0); } + operator Value () const { return get(); } private: Value value; diff --git a/src/ipc/mem/PagePool.h b/src/ipc/mem/PagePool.h index 9c8d93a297..d151263f19 100644 --- a/src/ipc/mem/PagePool.h +++ b/src/ipc/mem/PagePool.h @@ -26,6 +26,8 @@ public: PagePool(const String &id); unsigned int capacity() const { return shared->theCapacity; } + /// lower bound for the number of free pages + unsigned int size() const { return pageIndex.size(); } size_t pageSize() const { return shared->thePageSize; } /// sets page ID and returns true unless no free pages are found diff --git a/src/ipc/mem/PageStack.h b/src/ipc/mem/PageStack.h index 3048ba20a3..936a207cb4 100644 --- a/src/ipc/mem/PageStack.h +++ b/src/ipc/mem/PageStack.h @@ -25,6 +25,9 @@ public: /// attaches to the identified shared stack PageStack(const String &id); + /// lower bound for the number of free pages + unsigned int size() const { return max(0, shared->theSize.get()); } + /// sets value and returns true unless no free page numbers are found bool pop(Value &value); /// makes value available as a free page number to future pop() callers diff --git a/src/ipc/mem/Pages.cc b/src/ipc/mem/Pages.cc index 53f082a4a0..259720d400 100644 --- a/src/ipc/mem/Pages.cc +++ b/src/ipc/mem/Pages.cc @@ -72,8 +72,12 @@ Ipc::Mem::Limit() return Config.memMaxSize; } -// TODO: Implement size_t Ipc::Mem::Level() - +size_t +Ipc::Mem::Level() +{ + return ThePagePool ? + (ThePagePool->capacity() - ThePagePool->size()) * PageSize() : 0; +} /// initializes shared memory pages class SharedMemPagesRr: public RegisteredRunner