annotate qt/d1/qt/QtdObject.d @ 262:90131f64c9c9 lifetime

looks like enabling/disabling GC is enough
author maxter
date Tue, 22 Sep 2009 15:19:04 +0000
parents 8f7bb7fc3123
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
1 /**
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
2 *
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
3 * Copyright: Copyright QtD Team, 2008-2009
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
4 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
5 * Authors: Max Samukha, Eldar Insafutdinov
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
6 *
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
7 * Copyright QtD Team, 2008-2009
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
8 * Distributed under the Boost Software License, Version 1.0.
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
9 * (See accompanying file boost-license-1.0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
10 *
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
11 */
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
12
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
13 module qt.QtdObject;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
14
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
15 import qt.Signal;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
16 import tango.core.Memory;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
17 debug (QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
18 import tango.io.Stdout;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
19
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
20
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
21 enum QtdObjectFlags : ubyte
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
22 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
23 none,
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
24 // The native object will not be deleted when the wrapper is deleted
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
25 skipNativeDelete = 0b0_0001,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
26 // The wrapper will not be deleted when the native object is deleted
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
27 skipDDelete = 0b0_0010,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
28 // D object reference is stored in the shell
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
29 hasDId = 0b0_0100,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
30 // The wrapper is allocated on thread-local stack and destroyed at the end of the scope
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
31 stackAllocated = 0b0_1000
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
32 // It is a QObject
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
33 isQObject = 0b1_0000
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
34 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
35
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
36 class MetaObject
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
37 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
38 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
39
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
40 private
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
41 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
42 MetaObject _base;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
43 ClassInfo _classInfo;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
44 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
45
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
46 //COMPILER BUG: not accessible from QMetaObject
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
47 protected
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
48 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
49 This _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
50 This _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
51 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
52
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
53 private void addDerived(This mo)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
54 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
55 mo._next = _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
56 _firstDerived = mo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
57 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
58
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
59 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
60 Next sibling on this derivation level
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
61 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
62 final This next()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
63 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
64 return _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
65 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
66
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
67 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
68 Head of the linked list of derived classes
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
69 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
70 final This firstDerived()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
71 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
72 return _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
73 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
74
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
75 // NOTE: construction is split between this non-templated constructor and 'construct' function below.
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
76 this(This base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
77 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
78 if (base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
79 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
80 base.addDerived(this);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
81 _base = base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
82 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
83 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
84
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
85 // TODO: can be removed when D acquires templated constructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
86 void construct(T : Object)()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
87 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
88 _classInfo = T.classinfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
89 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
90
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
91 final This base()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
92 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
93 return _base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
94 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
95
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
96 final ClassInfo classInfo()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
97 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
98 return _classInfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
99 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
100 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
101
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
102
260
maxter
parents: 259
diff changeset
103 abstract class QtdMetaObjectBase : MetaObject
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
104 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
105 QtdObjectBase function(void* nativeId, QtdObjectFlags flags) _createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
106
260
maxter
parents: 259
diff changeset
107 this(QtdMetaObjectBase base)
maxter
parents: 259
diff changeset
108 {
maxter
parents: 259
diff changeset
109 super(base);
maxter
parents: 259
diff changeset
110 }
maxter
parents: 259
diff changeset
111
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
112 void construct(T : QtdObject)()
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
113 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
114 super.construct!(T);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
115 _createWrapper = &T.__createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
116 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
117 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
118
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
119
260
maxter
parents: 259
diff changeset
120 final class QtdMetaObject : QtdMetaObjectBase
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
121 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
122 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
123
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
124 private void* _typeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
125
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
126 this(void* typeId, QtdMetaObject base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
127 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
128 super(base);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
129 _typeId = typeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
130 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
131
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
132 QtdObject wrap(void* nativeId, void* typeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
133 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
134 if (typeId == _typeId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
135 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
136 /+
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
137 if (auto p = nativeId in _nativeToDMap)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
138 return *p;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
139 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
140 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
141 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
142 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
143 for (auto mo = static_cast!(This)(_firstDerived); mo; mo = static_cast!(This)(mo._next))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
144 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
145 if (auto obj = mo.wrap(nativeId, typeId, flags))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
146 return obj;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
147 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
148 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
149
260
maxter
parents: 259
diff changeset
150 return static_cast!(QtdObject)(_createWrapper(nativeId, flags));
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
151 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
152 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
153
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
154 /*
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
155 class IdMappings
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
156 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
157 private void* _data;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
158
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
159 this()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
160 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
161 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
162
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
163 void add(void* nativeId, void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
164 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
165 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
166
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
167 void remove(void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
168 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
169 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
170
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
171 void* opIndex[void* nativeId]
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
172 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
173 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
174
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
175 ~this()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
176 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
177 free(_data);
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
178 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
179 }
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
180 */
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
181
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
182 abstract class QtdObjectBase
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
183 {
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
184 }
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
185
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
186 // Base class for by-reference objects
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
187 abstract class QtdObject
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
188 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
189 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
190
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
191 private
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
192 {
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
193 typeof(this) __next, __prev;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
194 static typeof(this) __root;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
195 }
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
196
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
197 /// Internal members. Do not change
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
198 void* __nativeId;
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
199 /// ditto
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
200 QtdObjectFlags __flags;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
201
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
202 new (size_t size, QtdObjectFlags flags = QtdObjectFlags.none)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
203 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
204 return flags & QtdObjectFlags.stackAllocated ? __stackAlloc.alloc(size) :
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
205 GC.malloc(size, GC.BlkAttr.FINALIZE);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
206 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
207
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
208 delete (void* p)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
209 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
210 if ((cast(This)p).__flags & QtdObjectFlags.stackAllocated)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
211 __stackAlloc.free(this.classinfo.init.length);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
212 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
213 GC.free(p);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
214 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
215
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
216
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
217 mixin SignalHandlerOps;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
218
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
219 this(void* nativeId, QtdObjectFlags flags)
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
220 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
221 __nativeId = nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
222 __flags = flags;
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
223
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
224 debug(QtdVerbose) __print("D wrapper constructed");
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
225 /*
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
226 if (!(flags & QtdObjectFlags.isQObject) && !(flags & QtdObjectFlags.hasDId))
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
227 __addIdMapping;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
228 */
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
229 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
230
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
231 debug(QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
232 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
233 void __print(string msg)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
234 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
235 Stdout.formatln("{} (native: {}, D: {}, flags 0b{:b})", msg, __nativeId, cast(void*)this, __flags);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
236 }
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
237 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
238
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
239 protected void __deleteNative()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
240 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
241 assert(false, "Cannot delete native "
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
242 ~ this.classinfo.name
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
243 ~ " because it has no public destructor");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
244 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
245
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
246 /*
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
247 void __addIdMapping() {}
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
248 void __removeIdMapping() {}
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
249 */
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
250
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
251 final void __pin()
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
252 {
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
253 assert (!__prev && !__root is this);
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
254 __next = __root;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
255 __root = this;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
256 if (__next)
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
257 __next.__prev = this;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
258
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
259 debug(QtdVerbose) __print("Wrapper GC disabled");
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
260 }
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
261
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
262 final void __unpin()
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
263 {
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
264 assert (__prev || __root is this);
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
265
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
266 if (__prev)
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
267 {
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
268 __prev.__next = __next;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
269 __prev = null;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
270 }
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
271 else
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
272 __root = __next;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
273
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
274 if (__next)
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
275 __next.__prev = __prev;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
276
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
277 debug(QtdVerbose) __print("Wrapper GC reenabled");
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
278 }
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
279
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
280 ~this()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
281 {
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
282 /*
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
283 if (!(__flags & QtdObjectFlags.isQObject) && !(__flags & QtdObjectFlags.hasDId))
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
284 __removeMapping;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
285 */
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
286
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
287 debug(QtdVerbose) __print("In QtdObject destructor");
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
288
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
289 if (!(__flags & QtdObjectFlags.skipNativeDelete))
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
290 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
291 // Avoid deleting the wrapper twice
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
292 __flags |= QtdObjectFlags.skipDDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
293 debug(QtdVerbose) __print("About to call native delete");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
294 __deleteNative;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
295 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
296
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
297 if (__prev || __root is this)
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
298 __unpin;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
299 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
300 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
301
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
302 // Called from shell destructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
303 extern(C) void qtd_delete_d_object(void* dId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
304 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
305 auto obj = cast(QtdObject)dId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
306 debug(QtdVerbose) obj.__print("In qtd_delete_d_object");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
307
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
308 if (!(obj.__flags & QtdObjectFlags.skipDDelete))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
309 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
310 // Avoid deleting native object twice
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
311 obj.__flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
312 delete obj;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
313 }
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
314 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
315
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
316 extern(C) void qtd_pin(void* dId)
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
317 {
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
318 (cast(QtdObject)dId).__pin;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
319 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
320
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
321 extern(C) void qtd_native_unpin(void* dId)
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
322 {
262
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
323 (cast(QtdObject)dId).__unpin;
90131f64c9c9 looks like enabling/disabling GC is enough
maxter
parents: 261
diff changeset
324 }