1 | #include"safedelete.h"
|
---|
2 |
|
---|
3 | #include<qtimer.h>
|
---|
4 |
|
---|
5 | //----------------------------------------------------------------------------
|
---|
6 | // SafeDelete
|
---|
7 | //----------------------------------------------------------------------------
|
---|
8 | SafeDelete::SafeDelete()
|
---|
9 | {
|
---|
10 | lock = 0;
|
---|
11 | }
|
---|
12 |
|
---|
13 | SafeDelete::~SafeDelete()
|
---|
14 | {
|
---|
15 | if(lock)
|
---|
16 | lock->dying();
|
---|
17 | }
|
---|
18 |
|
---|
19 | void SafeDelete::deleteLater(QObject *o)
|
---|
20 | {
|
---|
21 | if(!lock)
|
---|
22 | deleteSingle(o);
|
---|
23 | else
|
---|
24 | list.append(o);
|
---|
25 | }
|
---|
26 |
|
---|
27 | void SafeDelete::unlock()
|
---|
28 | {
|
---|
29 | lock = 0;
|
---|
30 | deleteAll();
|
---|
31 | }
|
---|
32 |
|
---|
33 | void SafeDelete::deleteAll()
|
---|
34 | {
|
---|
35 | if(list.isEmpty())
|
---|
36 | return;
|
---|
37 |
|
---|
38 | QObjectListIt it(list);
|
---|
39 | for(QObject *o; (o = it.current()); ++it)
|
---|
40 | deleteSingle(o);
|
---|
41 | list.clear();
|
---|
42 | }
|
---|
43 |
|
---|
44 | void SafeDelete::deleteSingle(QObject *o)
|
---|
45 | {
|
---|
46 | #if QT_VERSION < 0x030000
|
---|
47 | // roll our own QObject::deleteLater()
|
---|
48 | SafeDeleteLater *sdl = SafeDeleteLater::ensureExists();
|
---|
49 | sdl->deleteItLater(o);
|
---|
50 | #else
|
---|
51 | o->deleteLater();
|
---|
52 | #endif
|
---|
53 | }
|
---|
54 |
|
---|
55 | //----------------------------------------------------------------------------
|
---|
56 | // SafeDeleteLock
|
---|
57 | //----------------------------------------------------------------------------
|
---|
58 | SafeDeleteLock::SafeDeleteLock(SafeDelete *sd)
|
---|
59 | {
|
---|
60 | own = false;
|
---|
61 | if(!sd->lock) {
|
---|
62 | _sd = sd;
|
---|
63 | _sd->lock = this;
|
---|
64 | }
|
---|
65 | else
|
---|
66 | _sd = 0;
|
---|
67 | }
|
---|
68 |
|
---|
69 | SafeDeleteLock::~SafeDeleteLock()
|
---|
70 | {
|
---|
71 | if(_sd) {
|
---|
72 | _sd->unlock();
|
---|
73 | if(own)
|
---|
74 | delete _sd;
|
---|
75 | }
|
---|
76 | }
|
---|
77 |
|
---|
78 | void SafeDeleteLock::dying()
|
---|
79 | {
|
---|
80 | _sd = new SafeDelete(*_sd);
|
---|
81 | own = true;
|
---|
82 | }
|
---|
83 |
|
---|
84 | //----------------------------------------------------------------------------
|
---|
85 | // SafeDeleteLater
|
---|
86 | //----------------------------------------------------------------------------
|
---|
87 | SafeDeleteLater *SafeDeleteLater::self = 0;
|
---|
88 |
|
---|
89 | SafeDeleteLater *SafeDeleteLater::ensureExists()
|
---|
90 | {
|
---|
91 | if(!self)
|
---|
92 | new SafeDeleteLater();
|
---|
93 | return self;
|
---|
94 | }
|
---|
95 |
|
---|
96 | SafeDeleteLater::SafeDeleteLater()
|
---|
97 | {
|
---|
98 | list.setAutoDelete(true);
|
---|
99 | self = this;
|
---|
100 | QTimer::singleShot(0, this, SLOT(explode()));
|
---|
101 | }
|
---|
102 |
|
---|
103 | SafeDeleteLater::~SafeDeleteLater()
|
---|
104 | {
|
---|
105 | list.clear();
|
---|
106 | self = 0;
|
---|
107 | }
|
---|
108 |
|
---|
109 | void SafeDeleteLater::deleteItLater(QObject *o)
|
---|
110 | {
|
---|
111 | list.append(o);
|
---|
112 | }
|
---|
113 |
|
---|
114 | void SafeDeleteLater::explode()
|
---|
115 | {
|
---|
116 | delete this;
|
---|
117 | }
|
---|