1 /* 2 * Copyright 2001-2011, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Erik Jaesler (erik@cgsoftware.com) 7 */ 8 #ifndef LOOPER_LIST_H 9 #define LOOPER_LIST_H 10 11 12 #include <vector> 13 14 #include <Locker.h> 15 #include <OS.h> 16 #include <SupportDefs.h> 17 18 19 class BList; 20 class BLooper; 21 22 23 namespace BPrivate { 24 25 26 class BLooperList { 27 public: 28 BLooperList(); 29 30 bool Lock(); 31 void Unlock(); 32 bool IsLocked(); 33 34 void AddLooper(BLooper* l); 35 bool IsLooperValid(const BLooper* l); 36 bool RemoveLooper(BLooper* l); 37 void GetLooperList(BList* list); 38 int32 CountLoopers(); 39 BLooper* LooperAt(int32 index); 40 BLooper* LooperForThread(thread_id tid); 41 BLooper* LooperForName(const char* name); 42 BLooper* LooperForPort(port_id port); 43 44 void InitAfterFork(); 45 46 private: 47 struct LooperData { 48 LooperData(); 49 LooperData(BLooper* looper); 50 LooperData(const LooperData& rhs); 51 LooperData& operator=(const LooperData& rhs); 52 53 BLooper* looper; 54 }; 55 typedef std::vector<BLooperList::LooperData>::iterator LooperDataIterator; 56 struct FindLooperPred { 57 FindLooperPred(const BLooper* loop) : looper(loop) {} 58 bool operator()(LooperData& Data); 59 const BLooper* looper; 60 }; 61 struct FindThreadPred { 62 FindThreadPred(thread_id tid) : thread(tid) {} 63 bool operator()(LooperData& Data); 64 thread_id thread; 65 }; 66 struct FindNamePred { 67 FindNamePred(const char* n) : name(n) {} 68 bool operator()(LooperData& Data); 69 const char* name; 70 }; 71 struct FindPortPred { 72 FindPortPred(port_id pid) : port(pid) {} 73 bool operator()(LooperData& Data); 74 port_id port; 75 }; 76 77 static bool EmptySlotPred(LooperData& Data); 78 void AssertLocked(); 79 80 private: 81 BLocker fLock; 82 std::vector<LooperData> fData; 83 }; 84 85 86 extern BLooperList gLooperList; 87 88 89 } // namespace BPrivate 90 91 92 #endif // LOOPER_LIST_H 93