X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FThreadCachedInt.h;h=9b7c3136f117518e6e71fdfd88249880b9e9192b;hb=6786799608b6ef203db9d7e880b99d0bc7330ede;hp=b84697216d3065477bd02d66d2d00c8dec191a9f;hpb=bae33d680bbba07b74d9bf9b2ba99766ebb3795e;p=folly.git diff --git a/folly/ThreadCachedInt.h b/folly/ThreadCachedInt.h index b8469721..9b7c3136 100644 --- a/folly/ThreadCachedInt.h +++ b/folly/ThreadCachedInt.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 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. @@ -47,7 +47,7 @@ class ThreadCachedInt : boost::noncopyable { void increment(IntT inc) { auto cache = cache_.get(); - if (UNLIKELY(cache == nullptr || cache->parent_ == nullptr)) { + if (UNLIKELY(cache == nullptr)) { cache = new IntCache(*this); cache_.reset(cache); } @@ -110,7 +110,10 @@ class ThreadCachedInt : boost::noncopyable { ThreadCachedInt& operator-=(IntT inc) { increment(-inc); return *this; } // pre-increment (we don't support post-increment) ThreadCachedInt& operator++() { increment(1); return *this; } - ThreadCachedInt& operator--() { increment(-1); return *this; } + ThreadCachedInt& operator--() { + increment(IntT(-1)); + return *this; + } // Thread-safe set function. // This is a best effort implementation. In some edge cases, there could be @@ -122,19 +125,11 @@ class ThreadCachedInt : boost::noncopyable { target_.store(newVal, std::memory_order_release); } - // This is a little tricky - it's possible that our IntCaches are still alive - // in another thread and will get destroyed after this destructor runs, so we - // need to make sure we signal that this parent is dead. - ~ThreadCachedInt() { - for (auto& cache : cache_.accessAllThreads()) { - cache.parent_ = nullptr; - } - } - private: std::atomic target_; std::atomic cacheSize_; - ThreadLocalPtr cache_; // Must be last for dtor ordering + ThreadLocalPtr + cache_; // Must be last for dtor ordering // This should only ever be modified by one thread struct IntCache { @@ -172,11 +167,9 @@ class ThreadCachedInt : boost::noncopyable { } ~IntCache() { - if (parent_) { - flush(); - } + flush(); } }; }; -} +} // namespace folly