Mercurial > projects > qtd
comparison d2/qtd/QtdObject.d @ 386:7dddafad5a20
shared stor fix
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Mon, 19 Jul 2010 13:29:57 +0300 |
parents | bd7f485e3573 |
children |
comparison
equal
deleted
inserted
replaced
385:e700fa4916e4 | 386:7dddafad5a20 |
---|---|
115 } | 115 } |
116 | 116 |
117 /** | 117 /** |
118 Disables GC for this object; | 118 Disables GC for this object; |
119 */ | 119 */ |
120 // TODO: needs to be properly synchronized | |
121 final void qtdPin() const | 120 final void qtdPin() const |
122 { | 121 { |
123 assert(!_flags.pinned); | 122 assert(!_flags.pinned); |
124 //GC.addRoot(cast(void*)this); | 123 //GC.addRoot(cast(void*)this); |
125 | 124 |
148 } | 147 } |
149 | 148 |
150 /** | 149 /** |
151 Enables GC for this object. | 150 Enables GC for this object. |
152 */ | 151 */ |
153 // TODO: needs to be properly synchronized | |
154 final void qtdUnpin() const | 152 final void qtdUnpin() const |
155 { | 153 { |
156 assert(_flags.pinned); | 154 assert(_flags.pinned); |
157 //GC.removeRoot(cast(void*)this); | 155 //GC.removeRoot(cast(void*)this); |
158 | 156 |
169 } | 167 } |
170 | 168 |
171 /** | 169 /** |
172 Sets the ownership of this object. | 170 Sets the ownership of this object. |
173 Setting the same ownership twice results in undefined behavior. | 171 Setting the same ownership twice results in undefined behavior. |
174 The function is not thread-safe. | |
175 */ | 172 */ |
176 void qtdSetOwnership(QtdObjectOwnership own) const | 173 void qtdSetOwnership(QtdObjectOwnership own) const |
177 { | 174 { |
178 if (_flags.isQObject) | 175 if (_flags.isQObject) |
179 return; | 176 return; |
184 if (own == QtdObjectOwnership.native) | 181 if (own == QtdObjectOwnership.native) |
185 { | 182 { |
186 if (_flags.polymorphic && _flags.createdByD) | 183 if (_flags.polymorphic && _flags.createdByD) |
187 qtdPin(); | 184 qtdPin(); |
188 else | 185 else |
186 { | |
187 assert (!obj._flags.nativeDeleteDisabled); | |
189 obj._flags.nativeDeleteDisabled = true; | 188 obj._flags.nativeDeleteDisabled = true; |
189 } | |
190 } | 190 } |
191 else if (own == QtdObjectOwnership.d) | 191 else if (own == QtdObjectOwnership.d) |
192 { | 192 { |
193 if (_flags.polymorphic && _flags.createdByD) | 193 if (_flags.polymorphic && _flags.createdByD) |
194 qtdUnpin(); | 194 qtdUnpin(); |
195 else | 195 else |
196 { | |
197 assert(obj._flags.nativeDeleteDisabled); | |
196 obj._flags.nativeDeleteDisabled = false; | 198 obj._flags.nativeDeleteDisabled = false; |
199 } | |
197 } | 200 } |
198 else | 201 else |
199 assert(false); | 202 assert(false); |
200 | 203 |
201 mixin(debugHandler("onObjectOwnershipChanged", "obj")); | 204 mixin(debugHandler("onObjectOwnershipChanged", "obj")); |
202 } | 205 } |
203 | 206 |
204 // COMPILER BUG: 3206 | 207 // COMPILER BUG: 3206 |
205 protected void qtdDeleteNative() | 208 protected void qtdDeleteNative() |
206 { | 209 { |
207 assert(false); | 210 assert(false); |
208 } | 211 } |
225 | 228 |
226 mixin(debugHandler("onWrapperDestroyed", "this")); | 229 mixin(debugHandler("onWrapperDestroyed", "this")); |
227 } | 230 } |
228 } | 231 } |
229 | 232 |
233 /* package */ abstract class PolymorphicObject : QtdObject | |
234 { | |
235 this(void* nativeId, QtdObjectInitFlags initFlags = QtdObjectInitFlags.none) | |
236 { | |
237 _flags.polymorphic = true; | |
238 super(nativeId, initFlags); | |
239 } | |
240 | |
241 abstract QtdMetaClass metaObject(); | |
242 } | |
243 | |
230 /** | 244 /** |
231 Base class for polymorphic non-QObjects (TBD). | 245 Base class for polymorphic non-QObjects (TBD). |
232 */ | 246 */ |
233 /* package */ abstract class NonQObject : QtdObject | 247 /* package */ abstract class NonQObject : PolymorphicObject |
234 { | 248 { |
235 alias NonQObjectMetaClass Meta; | 249 alias NonQObjectMetaClass Meta; |
236 | 250 |
237 this(void* nativeId, QtdObjectInitFlags initFlags) | 251 this(void* nativeId, QtdObjectInitFlags initFlags) |
238 { | 252 { |
239 _flags.polymorphic = true; | |
240 super(nativeId, initFlags); | 253 super(nativeId, initFlags); |
241 } | 254 } |
255 | |
256 override abstract Meta metaObject(); | |
242 } | 257 } |
243 | 258 |
244 /** | 259 /** |
245 Base class for QtD meta-object classes. | 260 Base class for QtD meta-object classes. |
246 */ | 261 */ |
253 | 268 |
254 this() {} | 269 this() {} |
255 | 270 |
256 /** | 271 /** |
257 */ | 272 */ |
258 @property | 273 @property void* nativeId() |
259 void* nativeId() | |
260 { | 274 { |
261 return _nativeId; | 275 return _nativeId; |
262 } | 276 } |
263 | 277 |
264 void construct(T)() | 278 void construct(T)() |
310 auto mo = lookUp(this); | 324 auto mo = lookUp(this); |
311 return static_cast!NonQObject(mo._createWrapper(nativeId, initFlags)); | 325 return static_cast!NonQObject(mo._createWrapper(nativeId, initFlags)); |
312 } | 326 } |
313 } | 327 } |
314 | 328 |
315 extern (C) bool qtdTypeInfosEqual(void* info1, void* info2); | 329 extern(C) bool qtdTypeInfosEqual(void* info1, void* info2); |
316 | 330 |
317 mixin(qtdExport("void", "QtdObject_delete", "void* dId", | 331 mixin(qtdExport("void", "QtdObject_delete", "void* dId", |
318 q{ | 332 q{ |
319 auto obj = cast(QtdObject)dId; | 333 auto obj = cast(QtdObject)dId; |
320 | 334 |