Commit 9642ca2d authored by Philip Pronin's avatar Philip Pronin Committed by facebook-github-bot-1

implement ThreadCachedArena::totalSize()

Summary: Semantics matches `Arena<>::totalSize()`.

Reviewed By: @luciang, @ot

Differential Revision: D2456388
parent 77bea361
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <folly/ThreadCachedArena.h> #include <folly/ThreadCachedArena.h>
#include <memory>
namespace folly { namespace folly {
ThreadCachedArena::ThreadCachedArena(size_t minBlockSize, size_t maxAlign) ThreadCachedArena::ThreadCachedArena(size_t minBlockSize, size_t maxAlign)
...@@ -36,8 +38,16 @@ SysArena* ThreadCachedArena::allocateThreadLocalArena() { ...@@ -36,8 +38,16 @@ SysArena* ThreadCachedArena::allocateThreadLocalArena() {
} }
void ThreadCachedArena::zombify(SysArena&& arena) { void ThreadCachedArena::zombify(SysArena&& arena) {
std::lock_guard<std::mutex> lock(zombiesMutex_); zombies_->merge(std::move(arena));
zombies_.merge(std::move(arena)); }
size_t ThreadCachedArena::totalSize() const {
size_t result = sizeof(ThreadCachedArena);
for (const auto& arena : arena_.accessAllThreads()) {
result += arena.totalSize();
}
result += zombies_->totalSize() - sizeof(SysArena);
return result;
} }
} // namespace folly } // namespace folly
...@@ -17,13 +17,11 @@ ...@@ -17,13 +17,11 @@
#ifndef FOLLY_THREADCACHEDARENA_H_ #ifndef FOLLY_THREADCACHEDARENA_H_
#define FOLLY_THREADCACHEDARENA_H_ #define FOLLY_THREADCACHEDARENA_H_
#include <utility> #include <type_traits>
#include <mutex>
#include <limits>
#include <boost/intrusive/slist.hpp>
#include <folly/Likely.h>
#include <folly/Arena.h> #include <folly/Arena.h>
#include <folly/Likely.h>
#include <folly/Synchronized.h>
#include <folly/ThreadLocal.h> #include <folly/ThreadLocal.h>
namespace folly { namespace folly {
...@@ -58,7 +56,12 @@ class ThreadCachedArena { ...@@ -58,7 +56,12 @@ class ThreadCachedArena {
// Deallocate? Never! // Deallocate? Never!
} }
// Gets the total memory used by the arena
size_t totalSize() const;
private: private:
struct ThreadLocalPtrTag {};
ThreadCachedArena(const ThreadCachedArena&) = delete; ThreadCachedArena(const ThreadCachedArena&) = delete;
ThreadCachedArena(ThreadCachedArena&&) = delete; ThreadCachedArena(ThreadCachedArena&&) = delete;
ThreadCachedArena& operator=(const ThreadCachedArena&) = delete; ThreadCachedArena& operator=(const ThreadCachedArena&) = delete;
...@@ -72,9 +75,11 @@ class ThreadCachedArena { ...@@ -72,9 +75,11 @@ class ThreadCachedArena {
const size_t minBlockSize_; const size_t minBlockSize_;
const size_t maxAlign_; const size_t maxAlign_;
SysArena zombies_; // allocated from threads that are now dead
std::mutex zombiesMutex_; ThreadLocalPtr<SysArena, ThreadLocalPtrTag> arena_; // Per-thread arena.
ThreadLocalPtr<SysArena> arena_; // per-thread arena
// Allocations from threads that are now dead.
Synchronized<SysArena> zombies_;
}; };
template <> template <>
......
...@@ -119,9 +119,13 @@ TEST(ThreadCachedArena, BlockSize) { ...@@ -119,9 +119,13 @@ TEST(ThreadCachedArena, BlockSize) {
TEST(ThreadCachedArena, SingleThreaded) { TEST(ThreadCachedArena, SingleThreaded) {
static const size_t requestedBlockSize = 64; static const size_t requestedBlockSize = 64;
ThreadCachedArena arena(requestedBlockSize); ThreadCachedArena arena(requestedBlockSize);
EXPECT_EQ(arena.totalSize(), sizeof(ThreadCachedArena));
ArenaTester tester(arena); ArenaTester tester(arena);
tester.allocate(100, 100 << 10); tester.allocate(100, 100 << 10);
tester.verify(); tester.verify();
EXPECT_GT(arena.totalSize(), sizeof(ThreadCachedArena));
} }
TEST(ThreadCachedArena, MultiThreaded) { TEST(ThreadCachedArena, MultiThreaded) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment