source: psi/vendor/affinix/current/cutestuff/util/safedelete.cpp@ 2

Last change on this file since 2 was 2, checked in by dmik, 19 years ago

Imported original Psi 0.10 sources from Affinix

File size: 1.9 KB
Line 
1#include"safedelete.h"
2
3#include<qtimer.h>
4
5//----------------------------------------------------------------------------
6// SafeDelete
7//----------------------------------------------------------------------------
8SafeDelete::SafeDelete()
9{
10 lock = 0;
11}
12
13SafeDelete::~SafeDelete()
14{
15 if(lock)
16 lock->dying();
17}
18
19void SafeDelete::deleteLater(QObject *o)
20{
21 if(!lock)
22 deleteSingle(o);
23 else
24 list.append(o);
25}
26
27void SafeDelete::unlock()
28{
29 lock = 0;
30 deleteAll();
31}
32
33void 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
44void 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//----------------------------------------------------------------------------
58SafeDeleteLock::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
69SafeDeleteLock::~SafeDeleteLock()
70{
71 if(_sd) {
72 _sd->unlock();
73 if(own)
74 delete _sd;
75 }
76}
77
78void SafeDeleteLock::dying()
79{
80 _sd = new SafeDelete(*_sd);
81 own = true;
82}
83
84//----------------------------------------------------------------------------
85// SafeDeleteLater
86//----------------------------------------------------------------------------
87SafeDeleteLater *SafeDeleteLater::self = 0;
88
89SafeDeleteLater *SafeDeleteLater::ensureExists()
90{
91 if(!self)
92 new SafeDeleteLater();
93 return self;
94}
95
96SafeDeleteLater::SafeDeleteLater()
97{
98 list.setAutoDelete(true);
99 self = this;
100 QTimer::singleShot(0, this, SLOT(explode()));
101}
102
103SafeDeleteLater::~SafeDeleteLater()
104{
105 list.clear();
106 self = 0;
107}
108
109void SafeDeleteLater::deleteItLater(QObject *o)
110{
111 list.append(o);
112}
113
114void SafeDeleteLater::explode()
115{
116 delete this;
117}
Note: See TracBrowser for help on using the repository browser.