~ubuntu-branches/ubuntu/saucy/kopete/saucy-proposed

« back to all changes in this revision

Viewing changes to protocols/jabber/libiris/src/irisnet/noncore/legacy/safedelete.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-06-21 02:22:39 UTC
  • Revision ID: package-import@ubuntu.com-20130621022239-63l3zc8p0nf26pt6
Tags: upstream-4.10.80
ImportĀ upstreamĀ versionĀ 4.10.80

Show diffs side-by-side

added added

removed removed

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