implement ThreadCachedArena::totalSize()
authorPhilip Pronin <philipp@fb.com>
Sat, 19 Sep 2015 06:38:39 +0000 (23:38 -0700)
committerfacebook-github-bot-1 <folly-bot@fb.com>
Sat, 19 Sep 2015 07:20:16 +0000 (00:20 -0700)
Summary: Semantics matches `Arena<>::totalSize()`.

Reviewed By: @luciang, @ot

Differential Revision: D2456388

folly/ThreadCachedArena.cpp
folly/ThreadCachedArena.h
folly/test/ThreadCachedArenaTest.cpp

index 53636042984816e3d8bb80bf886e9a5edf876cef..64c3eb965c9d8c191ea77bb99f3e076c6415332d 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <folly/ThreadCachedArena.h>
 
+#include <memory>
+
 namespace folly {
 
 ThreadCachedArena::ThreadCachedArena(size_t minBlockSize, size_t maxAlign)
@@ -36,8 +38,16 @@ SysArena* ThreadCachedArena::allocateThreadLocalArena() {
 }
 
 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
index ff1eb8fd076c9dea457baf1a951d81881d71c6cb..e34a618dfa4b41f86cf5ecfe99de26f86e3587ff 100644 (file)
 #ifndef FOLLY_THREADCACHEDARENA_H_
 #define FOLLY_THREADCACHEDARENA_H_
 
-#include <utility>
-#include <mutex>
-#include <limits>
-#include <boost/intrusive/slist.hpp>
+#include <type_traits>
 
-#include <folly/Likely.h>
 #include <folly/Arena.h>
+#include <folly/Likely.h>
+#include <folly/Synchronized.h>
 #include <folly/ThreadLocal.h>
 
 namespace folly {
@@ -58,7 +56,12 @@ class ThreadCachedArena {
     // Deallocate? Never!
   }
 
+  // Gets the total memory used by the arena
+  size_t totalSize() const;
+
  private:
+  struct ThreadLocalPtrTag {};
+
   ThreadCachedArena(const ThreadCachedArena&) = delete;
   ThreadCachedArena(ThreadCachedArena&&) = delete;
   ThreadCachedArena& operator=(const ThreadCachedArena&) = delete;
@@ -72,9 +75,11 @@ class ThreadCachedArena {
 
   const size_t minBlockSize_;
   const size_t maxAlign_;
-  SysArena zombies_;  // allocated from threads that are now dead
-  std::mutex zombiesMutex_;
-  ThreadLocalPtr<SysArena> arena_;  // per-thread arena
+
+  ThreadLocalPtr<SysArena, ThreadLocalPtrTag> arena_;  // Per-thread arena.
+
+  // Allocations from threads that are now dead.
+  Synchronized<SysArena> zombies_;
 };
 
 template <>
index 9c4e273d10afaa1197d4cc8ee49051bf5a6d01c1..756f153d35883b0b6f9716fee5b4ee667ab2c3b5 100644 (file)
@@ -119,9 +119,13 @@ TEST(ThreadCachedArena, BlockSize) {
 TEST(ThreadCachedArena, SingleThreaded) {
   static const size_t requestedBlockSize = 64;
   ThreadCachedArena arena(requestedBlockSize);
+  EXPECT_EQ(arena.totalSize(), sizeof(ThreadCachedArena));
+
   ArenaTester tester(arena);
   tester.allocate(100, 100 << 10);
   tester.verify();
+
+  EXPECT_GT(arena.totalSize(), sizeof(ThreadCachedArena));
 }
 
 TEST(ThreadCachedArena, MultiThreaded) {