-
Notifications
You must be signed in to change notification settings - Fork 532
/
CallbackPool-inl.h
82 lines (68 loc) · 2.12 KB
/
CallbackPool-inl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <set>
#include <folly/SharedMutex.h>
#include <glog/logging.h>
namespace facebook {
namespace memcache {
namespace mcrouter {
/* CallbackPool::CallbackHandle */
template <typename... Args>
struct CallbackPool<Args...>::CallbackHandleImpl {
public:
CallbackHandleImpl(const CallbackHandleImpl&) = delete;
CallbackHandleImpl& operator=(const CallbackHandleImpl&) = delete;
~CallbackHandleImpl() {
std::unique_lock lck(data_->callbackLock);
data_->callbacks.erase(this);
}
private:
friend class CallbackPool;
std::shared_ptr<Data> data_;
const OnUpdateFunc func_;
CallbackHandleImpl(std::shared_ptr<Data> data, OnUpdateFunc func)
: data_(std::move(data)), func_(std::move(func)) {
std::unique_lock lck(data_->callbackLock);
data_->callbacks.insert(this);
}
};
/* CallbackPool::Data */
template <typename... Args>
struct CallbackPool<Args...>::Data {
std::set<CallbackHandleImpl*> callbacks;
mutable folly::SharedMutex callbackLock;
};
/* CallbackPool */
template <typename... Args>
CallbackPool<Args...>::CallbackPool() : data_(std::make_shared<Data>()) {}
template <typename... Args>
void CallbackPool<Args...>::notify(Args... args) {
std::shared_lock lck(data_->callbackLock);
for (auto& it : data_->callbacks) {
try {
it->func_(args...);
} catch (const std::exception& e) {
LOG(ERROR) << "Error occured in callback: " << e.what();
} catch (...) {
LOG(ERROR) << "Unknown error occured in callback";
}
}
}
template <typename... Args>
typename CallbackPool<Args...>::CallbackHandle CallbackPool<Args...>::subscribe(
OnUpdateFunc callback) {
return std::unique_ptr<CallbackHandleImpl>(
new CallbackHandleImpl(data_, std::move(callback)));
}
template <typename... Args>
bool CallbackPool<Args...>::empty() {
std::shared_lock lck(data_->callbackLock);
return data_->callbacks.empty();
}
} // namespace mcrouter
} // namespace memcache
} // namespace facebook