make io::Cursor::push() safe to call with an empty ByteRange
[folly.git] / folly / ThreadCachedArena.h
index 469413b11482a6a05b452efe9566eb11c38acb63..9b22b6c9e1e1f2e089fbef18eb9093363bc10dc6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  */
 
-#ifndef FOLLY_THREADCACHEDARENA_H_
-#define FOLLY_THREADCACHEDARENA_H_
+#pragma once
 
-#include <utility>
-#include <mutex>
-#include <limits>
-#include <boost/intrusive/slist.hpp>
+#include <type_traits>
 
-#include "folly/Likely.h"
-#include "folly/Arena.h"
-#include "folly/ThreadLocal.h"
+#include <folly/Arena.h>
+#include <folly/Likely.h>
+#include <folly/Synchronized.h>
+#include <folly/ThreadLocal.h>
 
 namespace folly {
 
@@ -42,7 +39,8 @@ namespace folly {
 class ThreadCachedArena {
  public:
   explicit ThreadCachedArena(
-      size_t minBlockSize = SysArena::kDefaultMinBlockSize);
+      size_t minBlockSize = SysArena::kDefaultMinBlockSize,
+      size_t maxAlign = SysArena::kDefaultMaxAlign);
 
   void* allocate(size_t size) {
     SysArena* arena = arena_.get();
@@ -53,11 +51,16 @@ class ThreadCachedArena {
     return arena->allocate(size);
   }
 
-  void deallocate(void* p) {
+  void deallocate(void* /* p */) {
     // 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;
@@ -69,13 +72,16 @@ class ThreadCachedArena {
   // the ThreadCachedArena is destroyed.
   void zombify(SysArena&& arena);
 
-  size_t minBlockSize_;
-  SysArena zombies_;  // allocated from threads that are now dead
-  std::mutex zombiesMutex_;
-  ThreadLocalPtr<SysArena> arena_;  // per-thread arena
-};
+  const size_t minBlockSize_;
+  const size_t maxAlign_;
 
-}  // namespace folly
+  ThreadLocalPtr<SysArena, ThreadLocalPtrTag> arena_;  // Per-thread arena.
 
-#endif /* FOLLY_THREADCACHEDARENA_H_ */
+  // Allocations from threads that are now dead.
+  Synchronized<SysArena> zombies_;
+};
+
+template <>
+struct IsArenaAllocator<ThreadCachedArena> : std::true_type { };
 
+}  // namespace folly