34 std::unordered_map<std::string, std::shared_ptr<BlockerBase>>;
38 static const std::shared_ptr<BlockerManager>&
Instance() {
39 static auto instance =
45 bool Publish(
const std::string& channel_name,
49 bool Publish(
const std::string& channel_name,
53 bool Subscribe(
const std::string& channel_name,
size_t capacity,
54 const std::string& callback_id,
59 const std::string& callback_id);
62 std::shared_ptr<Blocker<T>>
GetBlocker(
const std::string& channel_name);
76 std::mutex blocker_mutex_;
103 const std::string& callback_id,
105 auto blocker = GetOrCreateBlocker<T>(
BlockerAttr(capacity, channel_name));
106 if (blocker ==
nullptr) {
109 return blocker->Subscribe(callback_id, callback);
124 const std::string& channel_name) {
125 std::shared_ptr<Blocker<T>> blocker =
nullptr;
127 std::lock_guard<std::mutex> lock(blocker_mutex_);
128 auto search = blockers_.find(channel_name);
129 if (search != blockers_.end()) {
130 blocker = std::dynamic_pointer_cast<Blocker<T>>(search->second);
139 std::shared_ptr<Blocker<T>> blocker =
nullptr;
141 std::lock_guard<std::mutex> lock(blocker_mutex_);
143 if (search != blockers_.end()) {
144 blocker = std::dynamic_pointer_cast<Blocker<T>>(search->second);
146 blocker = std::make_shared<Blocker<T>>(attr);