File indexing completed on 2026-05-10 08:42:56
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLDB_UTILITY_BROADCASTER_H
0010 #define LLDB_UTILITY_BROADCASTER_H
0011
0012 #include "lldb/Utility/ConstString.h"
0013 #include "lldb/lldb-defines.h"
0014 #include "lldb/lldb-forward.h"
0015
0016 #include "llvm/ADT/SmallVector.h"
0017
0018 #include <cstdint>
0019 #include <map>
0020 #include <memory>
0021 #include <mutex>
0022 #include <set>
0023 #include <string>
0024 #include <utility>
0025 #include <vector>
0026
0027 namespace lldb_private {
0028 class Broadcaster;
0029 class EventData;
0030 class Listener;
0031 class Stream;
0032 }
0033
0034 namespace lldb_private {
0035
0036
0037
0038
0039
0040 class BroadcastEventSpec {
0041 public:
0042 BroadcastEventSpec(llvm::StringRef broadcaster_class, uint32_t event_bits)
0043 : m_broadcaster_class(broadcaster_class), m_event_bits(event_bits) {}
0044
0045 ~BroadcastEventSpec() = default;
0046
0047 const std::string &GetBroadcasterClass() const { return m_broadcaster_class; }
0048
0049 uint32_t GetEventBits() const { return m_event_bits; }
0050
0051
0052
0053
0054 bool IsContainedIn(const BroadcastEventSpec &in_spec) const {
0055 if (m_broadcaster_class != in_spec.GetBroadcasterClass())
0056 return false;
0057 uint32_t in_bits = in_spec.GetEventBits();
0058 if (in_bits == m_event_bits)
0059 return true;
0060
0061 if ((m_event_bits & in_bits) != 0 && (m_event_bits & ~in_bits) == 0)
0062 return true;
0063
0064 return false;
0065 }
0066
0067 bool operator<(const BroadcastEventSpec &rhs) const;
0068
0069 private:
0070 std::string m_broadcaster_class;
0071 uint32_t m_event_bits;
0072 };
0073
0074 class BroadcasterManager
0075 : public std::enable_shared_from_this<BroadcasterManager> {
0076 public:
0077 friend class Listener;
0078
0079 protected:
0080 BroadcasterManager();
0081
0082 public:
0083
0084
0085
0086 static lldb::BroadcasterManagerSP MakeBroadcasterManager();
0087
0088 ~BroadcasterManager() = default;
0089
0090 lldb::ListenerSP
0091 GetListenerForEventSpec(const BroadcastEventSpec &event_spec) const;
0092
0093 void SignUpListenersForBroadcaster(Broadcaster &broadcaster);
0094
0095 void RemoveListener(const lldb::ListenerSP &listener_sp);
0096
0097 void RemoveListener(Listener *listener);
0098
0099 void Clear();
0100
0101 private:
0102 uint32_t
0103 RegisterListenerForEventsNoLock(const lldb::ListenerSP &listener_sp,
0104 const BroadcastEventSpec &event_spec);
0105
0106 bool UnregisterListenerForEventsNoLock(const lldb::ListenerSP &listener_sp,
0107 const BroadcastEventSpec &event_spec);
0108
0109 typedef std::pair<BroadcastEventSpec, lldb::ListenerSP> event_listener_key;
0110 typedef std::map<BroadcastEventSpec, lldb::ListenerSP> collection;
0111 typedef std::set<lldb::ListenerSP> listener_collection;
0112 collection m_event_map;
0113 listener_collection m_listeners;
0114
0115 mutable std::mutex m_manager_mutex;
0116 };
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146 class Broadcaster {
0147 friend class Listener;
0148 friend class Event;
0149
0150 public:
0151
0152
0153
0154
0155
0156
0157
0158 Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name);
0159
0160
0161
0162
0163 virtual ~Broadcaster();
0164
0165 void CheckInWithManager();
0166
0167
0168 void BroadcastEvent(lldb::EventSP &event_sp) {
0169 m_broadcaster_sp->BroadcastEvent(event_sp);
0170 }
0171
0172 void BroadcastEventIfUnique(lldb::EventSP &event_sp) {
0173 m_broadcaster_sp->BroadcastEventIfUnique(event_sp);
0174 }
0175
0176 void BroadcastEvent(uint32_t event_type,
0177 const lldb::EventDataSP &event_data_sp) {
0178 m_broadcaster_sp->BroadcastEvent(event_type, event_data_sp);
0179 }
0180
0181 void BroadcastEvent(uint32_t event_type) {
0182 m_broadcaster_sp->BroadcastEvent(event_type);
0183 }
0184
0185 void BroadcastEventIfUnique(uint32_t event_type) {
0186 m_broadcaster_sp->BroadcastEventIfUnique(event_type);
0187 }
0188
0189 void Clear() { m_broadcaster_sp->Clear(); }
0190
0191 virtual void AddInitialEventsToListener(const lldb::ListenerSP &listener_sp,
0192 uint32_t requested_events);
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213 uint32_t AddListener(const lldb::ListenerSP &listener_sp,
0214 uint32_t event_mask) {
0215 return m_broadcaster_sp->AddListener(listener_sp, event_mask);
0216 }
0217
0218
0219
0220
0221
0222
0223 const std::string &GetBroadcasterName() { return m_broadcaster_name; }
0224
0225
0226
0227
0228
0229
0230
0231
0232 bool GetEventNames(Stream &s, const uint32_t event_mask,
0233 bool prefix_with_broadcaster_name) const {
0234 return m_broadcaster_sp->GetEventNames(s, event_mask,
0235 prefix_with_broadcaster_name);
0236 }
0237
0238
0239
0240
0241
0242
0243 void SetEventName(uint32_t event_mask, const char *name) {
0244 m_broadcaster_sp->SetEventName(event_mask, name);
0245 }
0246
0247 const char *GetEventName(uint32_t event_mask) const {
0248 return m_broadcaster_sp->GetEventName(event_mask);
0249 }
0250
0251 bool EventTypeHasListeners(uint32_t event_type) {
0252 return m_broadcaster_sp->EventTypeHasListeners(event_type);
0253 }
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 bool RemoveListener(const lldb::ListenerSP &listener_sp,
0272 uint32_t event_mask = UINT32_MAX) {
0273 return m_broadcaster_sp->RemoveListener(listener_sp, event_mask);
0274 }
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294 bool HijackBroadcaster(const lldb::ListenerSP &listener_sp,
0295 uint32_t event_mask = UINT32_MAX) {
0296 return m_broadcaster_sp->HijackBroadcaster(listener_sp, event_mask);
0297 }
0298
0299 bool IsHijackedForEvent(uint32_t event_mask) {
0300 return m_broadcaster_sp->IsHijackedForEvent(event_mask);
0301 }
0302
0303
0304 void RestoreBroadcaster() { m_broadcaster_sp->RestoreBroadcaster(); }
0305
0306
0307
0308
0309
0310
0311 virtual llvm::StringRef GetBroadcasterClass() const;
0312
0313 lldb::BroadcasterManagerSP GetManager();
0314
0315 void SetPrimaryListener(lldb::ListenerSP listener_sp) {
0316 m_broadcaster_sp->SetPrimaryListener(listener_sp);
0317 }
0318
0319 lldb::ListenerSP GetPrimaryListener() {
0320 return m_broadcaster_sp->m_primary_listener_sp;
0321 }
0322
0323 protected:
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336 class BroadcasterImpl {
0337 friend class Listener;
0338 friend class Broadcaster;
0339
0340 public:
0341 BroadcasterImpl(Broadcaster &broadcaster);
0342
0343 ~BroadcasterImpl() = default;
0344
0345 void BroadcastEvent(lldb::EventSP &event_sp);
0346
0347 void BroadcastEventIfUnique(lldb::EventSP &event_sp);
0348
0349 void BroadcastEvent(uint32_t event_type);
0350
0351 void BroadcastEvent(uint32_t event_type,
0352 const lldb::EventDataSP &event_data_sp);
0353
0354 void BroadcastEventIfUnique(uint32_t event_type);
0355
0356 void Clear();
0357
0358 uint32_t AddListener(const lldb::ListenerSP &listener_sp,
0359 uint32_t event_mask);
0360
0361 const std::string &GetBroadcasterName() const {
0362 return m_broadcaster.GetBroadcasterName();
0363 }
0364
0365 Broadcaster *GetBroadcaster();
0366
0367 bool GetEventNames(Stream &s, const uint32_t event_mask,
0368 bool prefix_with_broadcaster_name) const;
0369
0370 void SetEventName(uint32_t event_mask, const char *name) {
0371 m_event_names[event_mask] = name;
0372 }
0373
0374 const char *GetEventName(uint32_t event_mask) const {
0375 const auto pos = m_event_names.find(event_mask);
0376 if (pos != m_event_names.end())
0377 return pos->second.c_str();
0378 return nullptr;
0379 }
0380
0381 bool EventTypeHasListeners(uint32_t event_type);
0382
0383 void SetPrimaryListener(lldb::ListenerSP listener_sp);
0384
0385 bool RemoveListener(lldb_private::Listener *listener,
0386 uint32_t event_mask = UINT32_MAX);
0387
0388 bool RemoveListener(const lldb::ListenerSP &listener_sp,
0389 uint32_t event_mask = UINT32_MAX);
0390
0391 bool HijackBroadcaster(const lldb::ListenerSP &listener_sp,
0392 uint32_t event_mask = UINT32_MAX);
0393
0394 bool IsHijackedForEvent(uint32_t event_mask);
0395
0396 void RestoreBroadcaster();
0397
0398 protected:
0399 void PrivateBroadcastEvent(lldb::EventSP &event_sp, bool unique);
0400
0401 const char *GetHijackingListenerName();
0402
0403 typedef llvm::SmallVector<std::pair<lldb::ListenerWP, uint32_t>, 4>
0404 collection;
0405 typedef std::map<uint32_t, std::string> event_names_map;
0406
0407 llvm::SmallVector<std::pair<lldb::ListenerSP, uint32_t &>, 4>
0408 GetListeners(uint32_t event_mask = UINT32_MAX, bool include_primary = true);
0409
0410 bool HasListeners(uint32_t event_mask);
0411
0412
0413 Broadcaster &m_broadcaster;
0414
0415
0416
0417 event_names_map m_event_names;
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442 collection m_listeners;
0443
0444
0445 std::mutex m_listeners_mutex;
0446
0447
0448 lldb::ListenerSP m_primary_listener_sp;
0449
0450 uint32_t m_primary_listener_mask = UINT32_MAX;
0451
0452
0453 std::vector<lldb::ListenerSP> m_hijacking_listeners;
0454
0455
0456
0457 std::vector<uint32_t> m_hijacking_masks;
0458
0459 private:
0460 BroadcasterImpl(const BroadcasterImpl &) = delete;
0461 const BroadcasterImpl &operator=(const BroadcasterImpl &) = delete;
0462 };
0463
0464 typedef std::shared_ptr<BroadcasterImpl> BroadcasterImplSP;
0465 typedef std::weak_ptr<BroadcasterImpl> BroadcasterImplWP;
0466
0467 BroadcasterImplSP GetBroadcasterImpl() { return m_broadcaster_sp; }
0468
0469 const char *GetHijackingListenerName() {
0470 return m_broadcaster_sp->GetHijackingListenerName();
0471 }
0472
0473 private:
0474 BroadcasterImplSP m_broadcaster_sp;
0475 lldb::BroadcasterManagerSP m_manager_sp;
0476
0477
0478 const std::string m_broadcaster_name;
0479
0480 Broadcaster(const Broadcaster &) = delete;
0481 const Broadcaster &operator=(const Broadcaster &) = delete;
0482 };
0483
0484 }
0485
0486 #endif