fix ConcurrentSkipList::Recycler layout
authorPhilip Pronin <philipp@fb.com>
Tue, 8 Apr 2014 18:08:02 +0000 (11:08 -0700)
committerptarjan <ptarjan@fb.com>
Wed, 9 Apr 2014 03:59:39 +0000 (20:59 -0700)
Summary:
D1261546 introduced regression in `sizeof(ConcurrentSkipList)`.
In case of `NodeAlloc = folly::SysAlloc`, size of an empty `NodeAlloc` struct
is 1 byte, due to the alignment requirements of the next field, it got
translated into wasting 8 bytes.

Test Plan: fbconfig -r folly/test && fbmake opt -j32

@override-unit-failures

Reviewed By: lucian@fb.com

FB internal diff: D1264730

folly/ConcurrentSkipList-inl.h

index c303ac0384972803e731c39a9f59df3a2e87d8da..11813f03e4931cd042b573f98fb330e87fa9910f 100644 (file)
@@ -234,7 +234,7 @@ class NodeRecycler<NodeType, NodeAlloc, typename std::enable_if<
   !NodeType::template destroyIsNoOp<NodeAlloc>()>::type> {
  public:
   explicit NodeRecycler(const NodeAlloc& alloc)
-    : alloc_(alloc), refs_(0), dirty_(false) { lock_.init(); }
+    : refs_(0), dirty_(false), alloc_(alloc) { lock_.init(); }
 
   ~NodeRecycler() {
     CHECK_EQ(refs(), 0);
@@ -304,11 +304,11 @@ class NodeRecycler<NodeType, NodeAlloc, typename std::enable_if<
     return refs_.load(std::memory_order_relaxed);
   }
 
-  NodeAlloc alloc_;
   std::unique_ptr<std::vector<NodeType*>> nodes_;
   std::atomic<int32_t> refs_; // current number of visitors to the list
   std::atomic<bool> dirty_; // whether *nodes_ is non-empty
   MicroSpinLock lock_; // protects access to *nodes_
+  NodeAlloc alloc_;
 };
 
 // In case of arena allocator, no recycling is necessary, and it's possible