Commit 4bfcf7b4 authored by Maged Michael's avatar Maged Michael Committed by Facebook Github Bot

hazptr: Prevent destructor of hazptr_priv from getting reference to itself

Summary: Prevent destructor of hazptr_priv which is a SingltonThreadLocal from making call to get a reference to the singlton. This may be a problem on some platforms.

Reviewed By: djwatson

Differential Revision: D8711918

fbshipit-source-id: fb319f640cff74e46ce27ab28ae5fbf93961b262
parent fb02412a
...@@ -127,6 +127,7 @@ hazptr_domain<Atom>& default_hazptr_domain(); ...@@ -127,6 +127,7 @@ hazptr_domain<Atom>& default_hazptr_domain();
template <template <typename> class Atom = std::atomic> template <template <typename> class Atom = std::atomic>
void hazptr_domain_push_retired( void hazptr_domain_push_retired(
hazptr_obj_list<Atom>& l, hazptr_obj_list<Atom>& l,
bool check = true,
hazptr_domain<Atom>& domain = default_hazptr_domain<Atom>()) noexcept; hazptr_domain<Atom>& domain = default_hazptr_domain<Atom>()) noexcept;
/** hazptr_retire */ /** hazptr_retire */
......
...@@ -100,6 +100,7 @@ class hazptr_domain { ...@@ -100,6 +100,7 @@ class hazptr_domain {
private: private:
friend void hazptr_domain_push_retired<Atom>( friend void hazptr_domain_push_retired<Atom>(
hazptr_obj_list<Atom>&, hazptr_obj_list<Atom>&,
bool check,
hazptr_domain<Atom>&) noexcept; hazptr_domain<Atom>&) noexcept;
friend class hazptr_holder<Atom>; friend class hazptr_holder<Atom>;
friend class hazptr_obj<Atom>; friend class hazptr_obj<Atom>;
...@@ -359,8 +360,9 @@ FOLLY_ALWAYS_INLINE hazptr_domain<Atom>& default_hazptr_domain() { ...@@ -359,8 +360,9 @@ FOLLY_ALWAYS_INLINE hazptr_domain<Atom>& default_hazptr_domain() {
template <template <typename> class Atom> template <template <typename> class Atom>
void hazptr_domain_push_retired( void hazptr_domain_push_retired(
hazptr_obj_list<Atom>& l, hazptr_obj_list<Atom>& l,
bool check,
hazptr_domain<Atom>& domain) noexcept { hazptr_domain<Atom>& domain) noexcept {
domain.push_retired(l); domain.push_retired(l, check);
} }
/** hazptr_retire */ /** hazptr_retire */
......
...@@ -114,7 +114,7 @@ class hazptr_obj { ...@@ -114,7 +114,7 @@ class hazptr_obj {
} }
#endif #endif
hazptr_obj_list<Atom> l(this); hazptr_obj_list<Atom> l(this);
hazptr_domain_push_retired(l, domain); hazptr_domain_push_retired(l, true, domain);
} }
FOLLY_NOINLINE void pre_retire_check_fail() noexcept { FOLLY_NOINLINE void pre_retire_check_fail() noexcept {
......
...@@ -187,12 +187,8 @@ class hazptr_priv { ...@@ -187,12 +187,8 @@ class hazptr_priv {
} }
void push(hazptr_obj<Atom>* obj) { void push(hazptr_obj<Atom>* obj) {
if (!in_dtor_) { DCHECK(!in_dtor_);
push_in_priv_list(obj); push_in_priv_list(obj);
} else {
hazptr_obj_list<Atom> l(obj);
hazptr_domain_push_retired<Atom>(l);
}
} }
void push_in_priv_list(hazptr_obj<Atom>* obj) { void push_in_priv_list(hazptr_obj<Atom>* obj) {
...@@ -219,7 +215,7 @@ class hazptr_priv { ...@@ -219,7 +215,7 @@ class hazptr_priv {
if (h) { if (h) {
DCHECK(t); DCHECK(t);
hazptr_obj_list<Atom> l(h, t, rcount_); hazptr_obj_list<Atom> l(h, t, rcount_);
hazptr_domain_push_retired<Atom>(l); hazptr_domain_push_retired<Atom>(l, false);
rcount_ = 0; rcount_ = 0;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment