Fix crash by sharing ownership of the toolchains in qtversion

This commit is contained in:
dt
2009-10-22 17:09:28 +02:00
parent cfc7040ede
commit 8a9d4315e6
3 changed files with 38 additions and 22 deletions

View File

@@ -495,10 +495,7 @@ void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFile
ProjectExplorer::ToolChain *Qt4Project::toolChain(BuildConfiguration *configuration) const ProjectExplorer::ToolChain *Qt4Project::toolChain(BuildConfiguration *configuration) const
{ {
ToolChain::ToolChainType tct = toolChainType(configuration); ToolChain::ToolChainType tct = toolChainType(configuration);
foreach(ToolChain *tc, qtVersion(configuration)->toolChains()) return qtVersion(configuration)->toolChain(tct);
if (tc->type() == tct)
return tc;
return 0;
} }
QString Qt4Project::makeCommand(BuildConfiguration *configuration) const QString Qt4Project::makeCommand(BuildConfiguration *configuration) const

View File

@@ -484,7 +484,7 @@ QtVersion::QtVersion()
QtVersion::~QtVersion() QtVersion::~QtVersion()
{ {
qDeleteAll(m_toolChains);
} }
QString QtVersion::name() const QString QtVersion::name() const
@@ -1062,16 +1062,24 @@ QString QtVersion::linguistCommand() const
return m_linguistCommand; return m_linguistCommand;
} }
QList<ProjectExplorer::ToolChain *> QtVersion::toolChains() const QList<QSharedPointer<ProjectExplorer::ToolChain> > QtVersion::toolChains() const
{ {
updateToolChain(); updateToolChain();
return m_toolChains; return m_toolChains;
} }
ProjectExplorer::ToolChain *QtVersion::toolChain(ProjectExplorer::ToolChain::ToolChainType type) const
{
foreach(QSharedPointer<ProjectExplorer::ToolChain> tcptr, toolChains())
if (tcptr->type() == type)
return tcptr.data();
return 0;
}
QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTypes() const QList<ProjectExplorer::ToolChain::ToolChainType> QtVersion::possibleToolChainTypes() const
{ {
QList<ProjectExplorer::ToolChain::ToolChainType> types; QList<ProjectExplorer::ToolChain::ToolChainType> types;
foreach(ProjectExplorer::ToolChain *tc, toolChains()) foreach(QSharedPointer<ProjectExplorer::ToolChain> tc, toolChains())
types << tc->type(); types << tc->type();
return types; return types;
} }
@@ -1090,7 +1098,7 @@ void QtVersion::updateToolChain() const
if (m_toolChainUpToDate) if (m_toolChainUpToDate)
return; return;
qDeleteAll(m_toolChains); m_toolChains.clear();
QString mkspecPath = versionInfo().value("QMAKE_MKSPECS"); QString mkspecPath = versionInfo().value("QMAKE_MKSPECS");
if (mkspecPath.isEmpty()) if (mkspecPath.isEmpty())
@@ -1109,32 +1117,41 @@ void QtVersion::updateToolChain() const
QString qt_arch = reader->value("QT_ARCH"); QString qt_arch = reader->value("QT_ARCH");
if (!ce_sdk.isEmpty() && !ce_arch.isEmpty()) { if (!ce_sdk.isEmpty() && !ce_arch.isEmpty()) {
QString wincePlatformName = ce_sdk + " (" + ce_arch + ")"; QString wincePlatformName = ce_sdk + " (" + ce_arch + ")";
m_toolChains << ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatformName); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
ProjectExplorer::ToolChain::createWinCEToolChain(msvcVersion(), wincePlatformName));
} else if (makefileGenerator == "SYMBIAN_ABLD") { } else if (makefileGenerator == "SYMBIAN_ABLD") {
#ifdef QTCREATOR_WITH_S60 #ifdef QTCREATOR_WITH_S60
m_toolChains << S60Manager::instance()->createGCCEToolChain(this); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5); S60Manager::instance()->createGCCEToolChain(this));
m_toolChains << S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
m_toolChains << S60Manager::instance()->createWINSCWToolChain(this); S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV5));
m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
S60Manager::instance()->createRVCTToolChain(this, ProjectExplorer::ToolChain::RVCT_ARMV6));
m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
S60Manager::instance()->createWINSCWToolChain(this));
#endif #endif
} else if (qt_arch == "arm") { } else if (qt_arch == "arm") {
#ifdef QTCREATOR_WITH_MAEMO #ifdef QTCREATOR_WITH_MAEMO
m_toolChains << MaemoManager::instance()->maemoToolChain(this); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
MaemoManager::instance()->maemoToolChain(this));
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
//addToEnvironment(env); //addToEnvironment(env);
qmakeCXX = env.searchInPath(qmakeCXX); qmakeCXX = env.searchInPath(qmakeCXX);
m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX));
#endif #endif
} else if (qmakeCXX == "cl" || qmakeCXX == "icl") { } else if (qmakeCXX == "cl" || qmakeCXX == "icl") {
// TODO proper support for intel cl // TODO proper support for intel cl
m_toolChains << ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit()); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
ProjectExplorer::ToolChain::createMSVCToolChain(msvcVersion(), isQt64Bit()));
} else if (qmakeCXX == "g++" && makefileGenerator == "MINGW") { } else if (qmakeCXX == "g++" && makefileGenerator == "MINGW") {
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
//addToEnvironment(env); //addToEnvironment(env);
env.prependOrSetPath(mingwDirectory() + "/bin"); env.prependOrSetPath(mingwDirectory() + "/bin");
qmakeCXX = env.searchInPath(qmakeCXX); qmakeCXX = env.searchInPath(qmakeCXX);
m_toolChains << ProjectExplorer::ToolChain::createMinGWToolChain(qmakeCXX, mingwDirectory()); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
ProjectExplorer::ToolChain::createMinGWToolChain(qmakeCXX, mingwDirectory()));
} else if (qmakeCXX == "g++" || qmakeCXX == "icc") { } else if (qmakeCXX == "g++" || qmakeCXX == "icc") {
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
//addToEnvironment(env); //addToEnvironment(env);
@@ -1144,7 +1161,8 @@ void QtVersion::updateToolChain() const
// Unfortunately, we need a valid QMAKE_CXX to configure the parser. // Unfortunately, we need a valid QMAKE_CXX to configure the parser.
qmakeCXX = QLatin1String("cc"); qmakeCXX = QLatin1String("cc");
} }
m_toolChains << ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX); m_toolChains << QSharedPointer<ProjectExplorer::ToolChain>(
ProjectExplorer::ToolChain::createGccToolChain(qmakeCXX));
} }
if (m_toolChains.isEmpty()) { if (m_toolChains.isEmpty()) {
@@ -1310,8 +1328,8 @@ QString QtVersion::buildDebuggingHelperLibrary()
addToEnvironment(env); addToEnvironment(env);
// TODO: the debugging helper doesn't comply to actual tool chain yet // TODO: the debugging helper doesn't comply to actual tool chain yet
QList<ProjectExplorer::ToolChain *> alltc = toolChains(); QList<QSharedPointer<ProjectExplorer::ToolChain> > alltc = toolChains();
ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first(); ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first().data();
tc->addToEnvironment(env); tc->addToEnvironment(env);
QString output; QString output;
QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, &output); QString directory = DebuggingHelperLibrary::copyDebuggingHelperLibrary(qtInstallData, &output);

View File

@@ -76,7 +76,7 @@ public:
QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const; QList<ProjectExplorer::ToolChain::ToolChainType> possibleToolChainTypes() const;
ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const; ProjectExplorer::ToolChain::ToolChainType defaultToolchainType() const;
QList<ProjectExplorer::ToolChain *> toolChains() const; ProjectExplorer::ToolChain *toolChain(ProjectExplorer::ToolChain::ToolChainType type) const;
/// @returns the name of the mkspec, which is generally not enough /// @returns the name of the mkspec, which is generally not enough
/// to pass to qmake. /// to pass to qmake.
@@ -131,6 +131,7 @@ public:
QmakeBuildConfig defaultBuildConfig() const; QmakeBuildConfig defaultBuildConfig() const;
private: private:
QList<QSharedPointer<ProjectExplorer::ToolChain> > toolChains() const;
static int getUniqueId(); static int getUniqueId();
// Also used by QtOptionsPageWidget // Also used by QtOptionsPageWidget
void updateSourcePath(); void updateSourcePath();
@@ -155,7 +156,7 @@ private:
mutable QString m_mkspecFullPath; mutable QString m_mkspecFullPath;
mutable bool m_toolChainUpToDate; mutable bool m_toolChainUpToDate;
mutable QList<ProjectExplorer::ToolChain *> m_toolChains; mutable QList<QSharedPointer<ProjectExplorer::ToolChain> > m_toolChains;
mutable bool m_versionInfoUpToDate; mutable bool m_versionInfoUpToDate;
mutable QHash<QString,QString> m_versionInfo; // updated lazily mutable QHash<QString,QString> m_versionInfo; // updated lazily