X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2Fexperimental%2Fhazptr%2Fhazptr-impl.h;h=5c343c5c7a6dc1058a0403f49131e611deb968c2;hp=823f2ebf68aa3a2781de014404e3f8762d590388;hb=42452e30b5695dbd38e2a0b3083e594945fb9876;hpb=7046d43c7e3c18ebc28c62141b8e1eefabce5323 diff --git a/folly/experimental/hazptr/hazptr-impl.h b/folly/experimental/hazptr/hazptr-impl.h index 823f2ebf..5c343c5c 100644 --- a/folly/experimental/hazptr/hazptr-impl.h +++ b/folly/experimental/hazptr/hazptr-impl.h @@ -1,5 +1,5 @@ /* - * Copyright 2017 Facebook, Inc. + * Copyright 2017-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /* override-include-guard */ #ifndef HAZPTR_H #error "This should only be included by hazptr.h" @@ -41,6 +40,10 @@ #define HAZPTR_PRIV true #endif +#ifndef HAZPTR_PRIV_THRESHOLD +#define HAZPTR_PRIV_THRESHOLD 20 +#endif + #ifndef HAZPTR_ONE_DOMAIN #define HAZPTR_ONE_DOMAIN false #endif @@ -265,12 +268,11 @@ inline bool hazptr_obj_base_refcounted::release_ref() { * hazptr_rec */ -class hazptr_rec { +class alignas(hardware_destructive_interference_size) hazptr_rec { friend class hazptr_domain; friend class hazptr_holder; friend struct hazptr_tc_entry; - FOLLY_ALIGN_TO_AVOID_FALSE_SHARING std::atomic hazptr_{nullptr}; hazptr_rec* next_{nullptr}; std::atomic active_{false}; @@ -452,9 +454,10 @@ FOLLY_ALWAYS_INLINE hazptr_array::hazptr_array( hazptr_array&& other) noexcept { DEBUG_PRINT(this << " " << M << " " << &other); auto h = reinterpret_cast(&raw_); + auto hother = reinterpret_cast(&other.raw_); for (size_t i = 0; i < M; ++i) { - new (&h[i]) hazptr_holder(std::move(other.h_[i])); - DEBUG_PRINT(i << " " << &h[i] << " " << &other.h_[i]); + new (&h[i]) hazptr_holder(std::move(hother[i])); + DEBUG_PRINT(i << " " << &h[i] << " " << &hother[i]); } empty_ = other.empty_; other.empty_ = true; @@ -994,8 +997,7 @@ inline void hazptr_priv::push(hazptr_obj* obj) { head_ = obj; } tail_ = obj; - ++rcount_; - if (domain.reachedThreshold(rcount_)) { + if (++rcount_ >= HAZPTR_PRIV_THRESHOLD) { pushAllToDomain(); } }