From 48fddd602da3df44554b20ba134c811010af5dc4 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 23 Jan 2008 15:56:17 -0500 Subject: BUG: Fix cmComputeLinkInformation cycle detection. --- Source/cmComputeLinkInformation.cxx | 22 ++++++++++++---------- Source/cmComputeLinkInformation.h | 5 +++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 5414041..d7db9b5 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1025,7 +1025,7 @@ void cmComputeLinkInformation::CollectRuntimeDirectories() } // Add link directories specified for the target. - std::vector const& dirs = this->GetDirectories(); + std::vector const& dirs = this->Target->GetLinkDirectories(); for(std::vector::const_iterator di = dirs.begin(); di != dirs.end(); ++di) { @@ -1168,39 +1168,41 @@ void cmComputeLinkInformation::OrderRuntimeSearchPath() { // Allow a cycle to be diagnosed once. this->CycleDiagnosed = false; + this->WalkId = 0; // Iterate through the directories in the original order. for(unsigned int i=0; i < this->RuntimeDirectories.size(); ++i) { - this->VisitRuntimeDirectory(i, true); + // Start a new DFS from this node. + ++this->WalkId; + this->VisitRuntimeDirectory(i); } } //---------------------------------------------------------------------------- -void cmComputeLinkInformation::VisitRuntimeDirectory(unsigned int i, - bool top) +void cmComputeLinkInformation::VisitRuntimeDirectory(unsigned int i) { // Skip nodes already visited. if(this->RuntimeDirectoryVisited[i]) { - if(!top) + if(this->RuntimeDirectoryVisited[i] == this->WalkId) { - // We have reached a previously visited node but were not called - // to start a new section of the graph. There is a cycle. + // We have reached a node previously visited on this DFS. + // There is a cycle. this->DiagnoseCycle(); } return; } - // We are not visiting this node so mark it. - this->RuntimeDirectoryVisited[i] = 1; + // We are now visiting this node so mark it. + this->RuntimeDirectoryVisited[i] = this->WalkId; // Visit the neighbors of the node first. RuntimeConflictList const& clist = this->RuntimeConflictGraph[i]; for(RuntimeConflictList::const_iterator j = clist.begin(); j != clist.end(); ++j) { - this->VisitRuntimeDirectory(j->first, false); + this->VisitRuntimeDirectory(j->first); } // Now that all directories required to come before this one have diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index 9f86c7d..65a870a 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -146,7 +146,7 @@ private: std::set LibraryRuntimeInfoEmmitted; std::vector RuntimeDirectories; std::map RuntimeDirectoryIndex; - std::vector RuntimeDirectoryVisited; + std::vector RuntimeDirectoryVisited; void AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget* target); void AddLibraryRuntimeInfo(std::string const& fullPath, const char* soname = 0); @@ -155,9 +155,10 @@ private: void FindConflictingLibraries(); void FindDirectoriesForLib(unsigned int lri); void OrderRuntimeSearchPath(); - void VisitRuntimeDirectory(unsigned int i, bool top); + void VisitRuntimeDirectory(unsigned int i); void DiagnoseCycle(); bool CycleDiagnosed; + int WalkId; // Adjacency-list representation of runtime path ordering graph. // This maps from directory to those that must come *before* it. -- cgit v0.12