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;
     }
 }