From e6620167fc573c2a39ee81dd41530ab188585e6c Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 12 Apr 2011 17:24:56 +0200
Subject: [PATCH] QmlProfiler: Enable on Windows

Replace use of sleep() call with a timer.
---
 src/plugins/plugins.pro                       | 12 ++++----
 src/plugins/qmlprofiler/qmlprofiler.pro       |  2 --
 src/plugins/qmlprofiler/qmlprofilerengine.cpp |  6 ----
 src/plugins/qmlprofiler/qmlprofilertool.cpp   | 29 ++++++++++++++++++-
 src/plugins/qmlprofiler/qmlprofilertool.h     |  3 ++
 5 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 6a7590626ac..58825e73b65 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -64,7 +64,7 @@ contains(QT_CONFIG, declarative) {
 
         minQtVersion(4, 7, 1) {
             SUBDIRS += plugin_qmldesigner
-	    !win32:SUBDIRS += plugin_qmlprofiler
+            SUBDIRS += plugin_qmlprofiler
         } else {
             warning()
             warning("QmlDesigner plugin has been disabled.")
@@ -269,13 +269,13 @@ plugin_analyzerbase.depends += plugin_projectexplorer
     plugin_callgrind.depends = plugin_coreplugin
     plugin_callgrind.depends += plugin_analyzerbase
     plugin_callgrind.depends += plugin_valgrindtoolbase
-
-    plugin_qmlprofiler.subdir = qmlprofiler
-    plugin_qmlprofiler.depends = plugin_coreplugin
-    plugin_qmlprofiler.depends += plugin_analyzerbase
-    plugin_qmlprofiler.depends += plugin_qmlprojectmanager
 }
 
+plugin_qmlprofiler.subdir = qmlprofiler
+plugin_qmlprofiler.depends = plugin_coreplugin
+plugin_qmlprofiler.depends += plugin_analyzerbase
+plugin_qmlprofiler.depends += plugin_qmlprojectmanager
+
 plugin_qmljstools.subdir = qmljstools
 plugin_qmljstools.depends = plugin_projectexplorer
 plugin_qmljstools.depends += plugin_coreplugin
diff --git a/src/plugins/qmlprofiler/qmlprofiler.pro b/src/plugins/qmlprofiler/qmlprofiler.pro
index ff399c98966..92fe11f0de9 100644
--- a/src/plugins/qmlprofiler/qmlprofiler.pro
+++ b/src/plugins/qmlprofiler/qmlprofiler.pro
@@ -8,11 +8,9 @@ include(../../plugins/coreplugin/coreplugin.pri)
 include(../../plugins/analyzerbase/analyzerbase.pri)
 include(../../plugins/qmlprojectmanager/qmlprojectmanager.pri)
 
-
 QT += network script declarative
 
 include(canvas/canvas.pri)
-#include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri)
 
 SOURCES += \
     qmlprofilerplugin.cpp \
diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp
index 2862dd184f9..edcfb468237 100644
--- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp
@@ -52,9 +52,6 @@
 
 #include <QProcess>
 
-#ifdef Q_OS_UNIX
-#include <unistd.h> // sleep
-#endif
 
 using namespace QmlProfiler::Internal;
 
@@ -176,9 +173,6 @@ bool QmlProfilerEngine::QmlProfilerEnginePrivate::launchperfmonitor()
     connect(m_process,SIGNAL(finished(int)),q,SLOT(spontaneousStop()));
     m_process->start(m_params.debuggee, arguments);
 
-    // give the process time to start
-    sleep(1);
-
     if (!m_process->waitForStarted()) {
         if (QmlProfilerPlugin::debugOutput)
             qWarning("QmlProfiler: %s failed to start", qPrintable(m_params.displayName));
diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp
index 8e592e6a883..cebc1fa4c4e 100644
--- a/src/plugins/qmlprofiler/qmlprofilertool.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp
@@ -109,6 +109,8 @@ public:
     QmlProfilerTool *q;
 
     QDeclarativeDebugConnection *m_client;
+    QTimer m_connectionTimer;
+    int m_connectionAttempts;
     TraceWindow *m_traceWindow;
     QTabWidget *m_tabbed;
     QmlProfilerSummaryView *m_summary;
@@ -128,6 +130,7 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent)
     : IAnalyzerTool(parent), d(new QmlProfilerToolPrivate(this))
 {
      d->m_client = 0;
+     d->m_connectionAttempts = 0;
      d->m_traceWindow = 0;
      d->m_outputPaneAdapter = 0;
      d->m_project = 0;
@@ -135,6 +138,9 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent)
      d->m_isAttached = false;
      d->m_attachAction = 0;
      d->m_recordingEnabled = true;
+
+     d->m_connectionTimer.setInterval(200);
+     connect(&d->m_connectionTimer, SIGNAL(timeout()), SLOT(tryToConnect()));
 }
 
 QmlProfilerTool::~QmlProfilerTool()
@@ -190,7 +196,7 @@ IAnalyzerEngine *QmlProfilerTool::createEngine(const AnalyzerStartParameters &sp
     return engine;
 }
 
-void QmlProfilerTool::initialize(ExtensionSystem::IPlugin */*plugin*/)
+void QmlProfilerTool::initialize(ExtensionSystem::IPlugin * /*plugin*/)
 {
     qmlRegisterType<Canvas>("Monitor", 1, 0, "Canvas");
     qmlRegisterType<TiledCanvas>("Monitor", 1, 0, "TiledCanvas");
@@ -286,6 +292,11 @@ QWidget *QmlProfilerTool::createTimeLineWidget()
 }
 
 void QmlProfilerTool::connectClient()
+{
+    d->m_connectionTimer.start();
+}
+
+void QmlProfilerTool::connectToClient()
 {
     QDeclarativeDebugConnection *newClient = new QDeclarativeDebugConnection;
     d->m_traceWindow->reset(newClient);
@@ -419,3 +430,19 @@ void QmlProfilerTool::updateAttachAction()
     d->m_attachAction->setEnabled(Analyzer::AnalyzerManager::instance()->currentTool() == this);
 }
 
+void QmlProfilerTool::tryToConnect()
+{
+    ++d->m_connectionAttempts;
+
+    if (d->m_client->isConnected()) {
+        d->m_connectionTimer.stop();
+        d->m_connectionAttempts = 0;
+    } else if (d->m_connectionAttempts == 50) {
+        d->m_connectionTimer.stop();
+        d->m_connectionAttempts = 0;
+        // TODO: Warn user that connection failed
+        //emit connectionStartupFailed();
+    } else {
+        connectToClient();
+    }
+}
diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h
index a59361929e0..58a6242b1a5 100644
--- a/src/plugins/qmlprofiler/qmlprofilertool.h
+++ b/src/plugins/qmlprofiler/qmlprofilertool.h
@@ -85,8 +85,11 @@ private slots:
     void updateProjectFileList();
     void attach();
     void updateAttachAction();
+    void tryToConnect();
 
 private:
+    void connectToClient();
+
     class QmlProfilerToolPrivate;
     QmlProfilerToolPrivate *d;
 };
-- 
GitLab