00001 #ifndef _sys_DeletionManager_h
00002 #define _sys_DeletionManager_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <vector>
00026 #include <algorithm>
00027 #include <boost/shared_ptr.hpp>
00028
00029 namespace qpid {
00030 namespace sys {
00031
00032 struct deleter
00033 {
00034 template <typename T>
00035 void operator()(T* ptr){ delete ptr;}
00036 };
00037
00054 template <typename H>
00055 class DeletionManager
00056 {
00057 public:
00058
00059
00060 static void markForDeletion(H* handle) {
00061 allThreadsStatuses.addHandle(shared_ptr(handle));
00062 }
00063
00064
00065
00066
00067 static void markAllUnusedInThisThread() {
00068 static __thread ThreadStatus* threadStatus = 0;
00069
00070
00071
00072
00073 if (!threadStatus) {
00074 threadStatus = new ThreadStatus;
00075 allThreadsStatuses.addThreadStatus(threadStatus);
00076 }
00077
00078 ScopedLock<Mutex> l(threadStatus->lock);
00079
00080
00081
00082 threadStatus->handles.clear();
00083 }
00084
00085 private:
00086 typedef boost::shared_ptr<H> shared_ptr;
00087
00088
00089
00090
00091 struct ThreadStatus
00092 {
00093 Mutex lock;
00094 std::vector<shared_ptr> handles;
00095 };
00096
00097 class AllThreadsStatuses
00098 {
00099 Mutex lock;
00100 std::vector<ThreadStatus*> statuses;
00101
00102 struct handleAdder
00103 {
00104 shared_ptr handle;
00105
00106 handleAdder(shared_ptr h): handle(h) {}
00107
00108 void operator()(ThreadStatus* ptr) {
00109 ScopedLock<Mutex> l(ptr->lock);
00110 ptr->handles.push_back(handle);
00111 }
00112 };
00113
00114 public:
00115
00116 explicit AllThreadsStatuses(int) {}
00117
00118 ~AllThreadsStatuses() {
00119 ScopedLock<Mutex> l(lock);
00120 std::for_each(statuses.begin(), statuses.end(), deleter());
00121 }
00122
00123 void addThreadStatus(ThreadStatus* t) {
00124 ScopedLock<Mutex> l(lock);
00125 statuses.push_back(t);
00126 }
00127
00128 void addHandle(shared_ptr h) {
00129 ScopedLock<Mutex> l(lock);
00130 std::for_each(statuses.begin(), statuses.end(), handleAdder(h));
00131 }
00132 };
00133
00134 static AllThreadsStatuses allThreadsStatuses;
00135 };
00136
00137 }}
00138 #endif // _sys_DeletionManager_h