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