Commit 66f868b7 authored by Chad Austin's avatar Chad Austin Committed by Facebook Github Bot

deprecate Synchronized::operator->

Summary:
Synchronized::operator-> is dangerous and leads to accidentally
acquiring locks or accidentally releasing them too soon. Add a
deprecated attribute that suggests using explicit locking instead.

Reviewed By: yfeldblum

Differential Revision: D18351232

fbshipit-source-id: 7bd3702bdd9b58dfa0fc7e8b8b636db9b5d7af8f
parent 50ecdebb
...@@ -620,7 +620,7 @@ struct Synchronized : public SynchronizedBase< ...@@ -620,7 +620,7 @@ struct Synchronized : public SynchronizedBase<
*/ */
Synchronized& operator=(const T& rhs) { Synchronized& operator=(const T& rhs) {
if (&datum_ != &rhs) { if (&datum_ != &rhs) {
auto guard = operator->(); auto guard = LockedPtr{this};
datum_ = rhs; datum_ = rhs;
} }
return *this; return *this;
...@@ -631,7 +631,7 @@ struct Synchronized : public SynchronizedBase< ...@@ -631,7 +631,7 @@ struct Synchronized : public SynchronizedBase<
*/ */
Synchronized& operator=(T&& rhs) { Synchronized& operator=(T&& rhs) {
if (&datum_ != &rhs) { if (&datum_ != &rhs) {
auto guard = operator->(); auto guard = LockedPtr{this};
datum_ = std::move(rhs); datum_ = std::move(rhs);
} }
return *this; return *this;
...@@ -689,7 +689,8 @@ struct Synchronized : public SynchronizedBase< ...@@ -689,7 +689,8 @@ struct Synchronized : public SynchronizedBase<
* NOTE: This API is planned to be deprecated in an upcoming diff. * NOTE: This API is planned to be deprecated in an upcoming diff.
* Prefer using lock(), wlock(), or rlock() instead. * Prefer using lock(), wlock(), or rlock() instead.
*/ */
LockedPtr operator->() { [[deprecated("use explicit lock(), wlock(), or rlock() instead")]] LockedPtr
operator->() {
return LockedPtr(this); return LockedPtr(this);
} }
...@@ -699,7 +700,9 @@ struct Synchronized : public SynchronizedBase< ...@@ -699,7 +700,9 @@ struct Synchronized : public SynchronizedBase<
* NOTE: This API is planned to be deprecated in an upcoming diff. * NOTE: This API is planned to be deprecated in an upcoming diff.
* Prefer using lock(), wlock(), or rlock() instead. * Prefer using lock(), wlock(), or rlock() instead.
*/ */
ConstLockedPtr operator->() const { [[deprecated(
"use explicit lock(), wlock(), or rlock() instead")]] ConstLockedPtr
operator->() const {
return ConstLockedPtr(this); return ConstLockedPtr(this);
} }
...@@ -739,8 +742,8 @@ struct Synchronized : public SynchronizedBase< ...@@ -739,8 +742,8 @@ struct Synchronized : public SynchronizedBase<
if (this > &rhs) { if (this > &rhs) {
return rhs.swap(*this); return rhs.swap(*this);
} }
auto guard1 = operator->(); auto guard1 = LockedPtr{this};
auto guard2 = rhs.operator->(); auto guard2 = LockedPtr{&rhs};
using std::swap; using std::swap;
swap(datum_, rhs.datum_); swap(datum_, rhs.datum_);
...@@ -1804,7 +1807,7 @@ void swap(Synchronized<T, M>& lhs, Synchronized<T, M>& rhs) { ...@@ -1804,7 +1807,7 @@ void swap(Synchronized<T, M>& lhs, Synchronized<T, M>& rhs) {
if (bool SYNCHRONIZED_VAR(state) = false) { \ if (bool SYNCHRONIZED_VAR(state) = false) { \
} else \ } else \
for (auto SYNCHRONIZED_VAR(lockedPtr) = \ for (auto SYNCHRONIZED_VAR(lockedPtr) = \
(FB_VA_GLUE(FB_ARG_2_OR_1, (__VA_ARGS__))).operator->(); \ (FB_VA_GLUE(FB_ARG_2_OR_1, (__VA_ARGS__))).contextualLock(); \
!SYNCHRONIZED_VAR(state); \ !SYNCHRONIZED_VAR(state); \
SYNCHRONIZED_VAR(state) = true) \ SYNCHRONIZED_VAR(state) = true) \
for (auto& FB_VA_GLUE(FB_ARG_1, (__VA_ARGS__)) = \ for (auto& FB_VA_GLUE(FB_ARG_1, (__VA_ARGS__)) = \
......
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