Mercurial > projects > qtd
diff d2/qtd/MOC.d @ 365:958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 11 Jun 2010 20:09:25 +0300 |
parents | a084e2df3776 |
children | f69341b40588 |
line wrap: on
line diff
--- a/d2/qtd/MOC.d Fri Jun 11 12:16:09 2010 +0300 +++ b/d2/qtd/MOC.d Fri Jun 11 20:09:25 2010 +0300 @@ -490,12 +490,10 @@ mixin template Q_OBJECT() { - import - std.typetuple, - qtd.meta.Runtime, - qtd.Marshal, - qt.core.QString, - std.stdio; + import std.typetuple; + import qtd.Marshal; + import std.stdio; + import qt.core.QString; // for QStringUtil.toNative public: // required to override the outside scope protection. @@ -532,24 +530,43 @@ @property override QMetaObject metaObject() const { return staticMetaObject(); } + private static + { + __gshared QMetaObject staticMetaObject_; + __gshared QMetaObjectNative nativeStaticMetaObject_; + bool staticMoInited_; + } + @property static QMetaObject staticMetaObject() { - return meta!This; + // using a thread-local flag to mitigate + // the performance hit caused by lazy initialization + if(!staticMoInited_) + { + synchronized(qtdMoLock) + { + if (!staticMetaObject_) + { + alias BaseClassesTuple!(This)[0] Base; + + nativeStaticMetaObject_ = QMetaObjectNative( + Base.staticMetaObject.nativeId, + qt_meta_stringdata.ptr, + qt_meta_data.ptr, null); + + QMetaObject.create!This(&nativeStaticMetaObject_); + } + } + staticMoInited_ = true; + } + + return staticMetaObject_; } - @property static void* qtd_nativeMetaObject() + /*internal*/ static void setStaticMetaObject(QMetaObject m) { - __gshared static QMetaObjectNative nativeMo; - if (!nativeMo.data) - { - alias BaseClassesTuple!(This)[0] Base; - nativeMo = QMetaObjectNative( - Base.staticMetaObject.nativeId, - qt_meta_stringdata.ptr, - qt_meta_data.ptr, null); - } - return &nativeMo; + staticMetaObject_ = m; } }