forked from facebook/rocksdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Port folly/synchronization/DistributedMutex to rocksdb (facebook#5642)
Summary: This ports `folly::DistributedMutex` into RocksDB. The PR includes everything else needed to compile and use DistributedMutex as a component within folly. Most files are unchanged except for some portability stuff and includes. For now, I've put this under `rocksdb/third-party`, but if there is a better folder to put this under, let me know. I also am not sure how or where to put unit tests for third-party stuff like this. It seems like gtest is included already, but I need to link with it from another third-party folder. This also includes some other common components from folly - folly/Optional - folly/ScopeGuard (In particular `SCOPE_EXIT`) - folly/synchronization/ParkingLot (A portable futex-like interface) - folly/synchronization/AtomicNotification (The standard C++ interface for futexes) - folly/Indestructible (For singletons that don't get destroyed without allocations) Pull Request resolved: facebook#5642 Differential Revision: D16544439 fbshipit-source-id: 179b98b5dcddc3075926d31a30f92fd064245731
- Loading branch information
1 parent
6e78fe3
commit 38b03c8
Showing
48 changed files
with
7,335 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under both the GPLv2 (found in the | ||
// COPYING file in the root directory) and Apache 2.0 License | ||
// (found in the LICENSE.Apache file in the root directory). | ||
|
||
#pragma once | ||
|
||
/** | ||
* Macro for marking functions as having public visibility. | ||
*/ | ||
#if defined(__GNUC__) | ||
#define FOLLY_EXPORT __attribute__((__visibility__("default"))) | ||
#else | ||
#define FOLLY_EXPORT | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under both the GPLv2 (found in the | ||
// COPYING file in the root directory) and Apache 2.0 License | ||
// (found in the LICENSE.Apache file in the root directory). | ||
|
||
#pragma once | ||
|
||
namespace folly { | ||
template <typename T> | ||
constexpr T constexpr_max(T a) { | ||
return a; | ||
} | ||
template <typename T, typename... Ts> | ||
constexpr T constexpr_max(T a, T b, Ts... ts) { | ||
return b < a ? constexpr_max(a, ts...) : constexpr_max(b, ts...); | ||
} | ||
} // namespace folly |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under both the GPLv2 (found in the | ||
// COPYING file in the root directory) and Apache 2.0 License | ||
// (found in the LICENSE.Apache file in the root directory). | ||
|
||
#pragma once | ||
|
||
#include <cassert> | ||
#include <type_traits> | ||
#include <utility> | ||
|
||
#include <folly/Traits.h> | ||
|
||
namespace folly { | ||
|
||
/*** | ||
* Indestructible | ||
* | ||
* When you need a Meyers singleton that will not get destructed, even at | ||
* shutdown, and you also want the object stored inline. | ||
* | ||
* Use like: | ||
* | ||
* void doSomethingWithExpensiveData(); | ||
* | ||
* void doSomethingWithExpensiveData() { | ||
* static const Indestructible<map<string, int>> data{ | ||
* map<string, int>{{"key1", 17}, {"key2", 19}, {"key3", 23}}, | ||
* }; | ||
* callSomethingTakingAMapByRef(*data); | ||
* } | ||
* | ||
* This should be used only for Meyers singletons, and, even then, only when | ||
* the instance does not need to be destructed ever. | ||
* | ||
* This should not be used more generally, e.g., as member fields, etc. | ||
* | ||
* This is designed as an alternative, but with one fewer allocation at | ||
* construction time and one fewer pointer dereference at access time, to the | ||
* Meyers singleton pattern of: | ||
* | ||
* void doSomethingWithExpensiveData() { | ||
* static const auto data = // never `delete`d | ||
* new map<string, int>{{"key1", 17}, {"key2", 19}, {"key3", 23}}; | ||
* callSomethingTakingAMapByRef(*data); | ||
* } | ||
*/ | ||
|
||
template <typename T> | ||
class Indestructible final { | ||
public: | ||
template <typename S = T, typename = decltype(S())> | ||
constexpr Indestructible() noexcept(noexcept(T())) {} | ||
|
||
/** | ||
* Constructor accepting a single argument by forwarding reference, this | ||
* allows using list initialzation without the overhead of things like | ||
* in_place, etc and also works with std::initializer_list constructors | ||
* which can't be deduced, the default parameter helps there. | ||
* | ||
* auto i = folly::Indestructible<std::map<int, int>>{{{1, 2}}}; | ||
* | ||
* This provides convenience | ||
* | ||
* There are two versions of this constructor - one for when the element is | ||
* implicitly constructible from the given argument and one for when the | ||
* type is explicitly but not implicitly constructible from the given | ||
* argument. | ||
*/ | ||
template < | ||
typename U = T, | ||
_t<std::enable_if<std::is_constructible<T, U&&>::value>>* = nullptr, | ||
_t<std::enable_if< | ||
!std::is_same<Indestructible<T>, remove_cvref_t<U>>::value>>* = | ||
nullptr, | ||
_t<std::enable_if<!std::is_convertible<U&&, T>::value>>* = nullptr> | ||
explicit constexpr Indestructible(U&& u) noexcept( | ||
noexcept(T(std::declval<U>()))) | ||
: storage_(std::forward<U>(u)) {} | ||
template < | ||
typename U = T, | ||
_t<std::enable_if<std::is_constructible<T, U&&>::value>>* = nullptr, | ||
_t<std::enable_if< | ||
!std::is_same<Indestructible<T>, remove_cvref_t<U>>::value>>* = | ||
nullptr, | ||
_t<std::enable_if<std::is_convertible<U&&, T>::value>>* = nullptr> | ||
/* implicit */ constexpr Indestructible(U&& u) noexcept( | ||
noexcept(T(std::declval<U>()))) | ||
: storage_(std::forward<U>(u)) {} | ||
|
||
template <typename... Args, typename = decltype(T(std::declval<Args>()...))> | ||
explicit constexpr Indestructible(Args&&... args) noexcept( | ||
noexcept(T(std::declval<Args>()...))) | ||
: storage_(std::forward<Args>(args)...) {} | ||
template < | ||
typename U, | ||
typename... Args, | ||
typename = decltype( | ||
T(std::declval<std::initializer_list<U>&>(), | ||
std::declval<Args>()...))> | ||
explicit constexpr Indestructible(std::initializer_list<U> il, Args... args) noexcept( | ||
noexcept( | ||
T(std::declval<std::initializer_list<U>&>(), | ||
std::declval<Args>()...))) | ||
: storage_(il, std::forward<Args>(args)...) {} | ||
|
||
~Indestructible() = default; | ||
|
||
Indestructible(Indestructible const&) = delete; | ||
Indestructible& operator=(Indestructible const&) = delete; | ||
|
||
Indestructible(Indestructible&& other) noexcept( | ||
noexcept(T(std::declval<T>()))) | ||
: storage_(std::move(other.storage_.value)) { | ||
other.erased_ = true; | ||
} | ||
Indestructible& operator=(Indestructible&& other) noexcept( | ||
noexcept(T(std::declval<T>()))) { | ||
storage_.value = std::move(other.storage_.value); | ||
other.erased_ = true; | ||
} | ||
|
||
T* get() noexcept { | ||
check(); | ||
return &storage_.value; | ||
} | ||
T const* get() const noexcept { | ||
check(); | ||
return &storage_.value; | ||
} | ||
T& operator*() noexcept { | ||
return *get(); | ||
} | ||
T const& operator*() const noexcept { | ||
return *get(); | ||
} | ||
T* operator->() noexcept { | ||
return get(); | ||
} | ||
T const* operator->() const noexcept { | ||
return get(); | ||
} | ||
|
||
private: | ||
void check() const noexcept { | ||
assert(!erased_); | ||
} | ||
|
||
union Storage { | ||
T value; | ||
|
||
template <typename S = T, typename = decltype(S())> | ||
constexpr Storage() noexcept(noexcept(T())) : value() {} | ||
|
||
template <typename... Args, typename = decltype(T(std::declval<Args>()...))> | ||
explicit constexpr Storage(Args&&... args) noexcept( | ||
noexcept(T(std::declval<Args>()...))) | ||
: value(std::forward<Args>(args)...) {} | ||
|
||
~Storage() {} | ||
}; | ||
|
||
Storage storage_{}; | ||
bool erased_{false}; | ||
}; | ||
} // namespace folly |
Oops, something went wrong.