kDB: Knowledge DataBase
Loading...
Searching...
No Matches
ReusableResource.h
1#include <QExplicitlySharedDataPointer>
2#include <QMutex>
3
4#include <clog_qt>
5
6namespace knowCore
7{
14 template<typename _T_>
16 {
17 public:
18 struct Handle_ : public QSharedData
19 {
20 friend ReusableResource;
21 ~Handle_()
22 {
23 QMutexLocker l(&m_owner->m_mutex);
24 m_owner->m_available.append(m_t);
25 }
26 _T_* ressource() const { return m_t; }
27 private:
28 _T_* m_t;
29 ReusableResource<_T_>* m_owner;
30 };
31 using Handle = QExplicitlySharedDataPointer<Handle_>;
32 public:
33 ReusableResource(bool _free_resources = true) : m_free_resources(false) {}
35 {
36 QMutexLocker l(&m_mutex);
37 clog_assert(m_available.size() == m_resources.size());
38 if(m_free_resources)
39 {
40 qDeleteAll(m_resources);
41 }
42 }
43 Handle get()
44 {
45 Handle h(new Handle_);
46 h->m_owner = this;
47 QMutexLocker l(&m_mutex);
48 if(m_available.isEmpty())
49 {
50 h->m_t = new _T_;
51 m_resources.append(h->m_t);
52 }
53 else
54 {
55 h->m_t = m_available.takeFirst();
56 }
57 return h;
58 }
59 public:
60 bool m_free_resources;
61 QMutex m_mutex;
62 QList<_T_*> m_available;
63 QList<_T_*> m_resources;
64 };
65} // namespace knowCore
Definition Revision.h:9
Definition ReusableResource.h:16
Definition ReusableResource.h:19