Graphviz: Fix issue with too many open file streams on Windows platform

Fixes #20931
This commit is contained in:
Stephan Rohmen
2020-07-31 22:26:08 +02:00
parent 383090bf59
commit 57f250dcc0
2 changed files with 14 additions and 34 deletions

View File

@@ -125,14 +125,6 @@ cmGraphVizWriter::cmGraphVizWriter(std::string const& fileName,
cmGraphVizWriter::~cmGraphVizWriter() cmGraphVizWriter::~cmGraphVizWriter()
{ {
this->WriteFooter(this->GlobalFileStream); this->WriteFooter(this->GlobalFileStream);
for (auto& fileStream : this->PerTargetFileStreams) {
this->WriteFooter(*fileStream.second);
}
for (auto& fileStream : this->TargetDependersFileStreams) {
this->WriteFooter(*fileStream.second);
}
} }
void cmGraphVizWriter::VisitGraph(std::string const&) void cmGraphVizWriter::VisitGraph(std::string const&)
@@ -151,20 +143,10 @@ void cmGraphVizWriter::OnItem(cmLinkItem const& item)
++NextNodeId; ++NextNodeId;
this->WriteNode(this->GlobalFileStream, item); this->WriteNode(this->GlobalFileStream, item);
if (this->GeneratePerTarget) {
this->CreateTargetFile(this->PerTargetFileStreams, item);
}
if (this->GenerateDependers) {
this->CreateTargetFile(this->TargetDependersFileStreams, item,
".dependers");
}
} }
void cmGraphVizWriter::CreateTargetFile(FileStreamMap& fileStreamMap, std::unique_ptr<cmGeneratedFileStream> cmGraphVizWriter::CreateTargetFile(
cmLinkItem const& item, cmLinkItem const& item, std::string const& fileNameSuffix)
std::string const& fileNameSuffix)
{ {
auto const pathSafeItemName = PathSafeString(item.AsStr()); auto const pathSafeItemName = PathSafeString(item.AsStr());
auto const perTargetFileName = auto const perTargetFileName =
@@ -175,7 +157,7 @@ void cmGraphVizWriter::CreateTargetFile(FileStreamMap& fileStreamMap,
this->WriteHeader(*perTargetFileStream, item.AsStr()); this->WriteHeader(*perTargetFileStream, item.AsStr());
this->WriteNode(*perTargetFileStream, item); this->WriteNode(*perTargetFileStream, item);
fileStreamMap.emplace(item.AsStr(), std::move(perTargetFileStream)); return perTargetFileStream;
} }
void cmGraphVizWriter::OnDirectLink(cmLinkItem const& depender, void cmGraphVizWriter::OnDirectLink(cmLinkItem const& depender,
@@ -323,13 +305,12 @@ void cmGraphVizWriter::Write()
} }
if (this->GeneratePerTarget) { if (this->GeneratePerTarget) {
WritePerTargetConnections<DependeesDir>(PerTargetConnections, WritePerTargetConnections<DependeesDir>(PerTargetConnections);
PerTargetFileStreams);
} }
if (this->GenerateDependers) { if (this->GenerateDependers) {
WritePerTargetConnections<DependersDir>(TargetDependersConnections, WritePerTargetConnections<DependersDir>(TargetDependersConnections,
TargetDependersFileStreams); ".dependers");
} }
} }
@@ -368,7 +349,7 @@ void cmGraphVizWriter::FindAllConnections(const ConnectionsMap& connectionMap,
template <typename DirFunc> template <typename DirFunc>
void cmGraphVizWriter::WritePerTargetConnections( void cmGraphVizWriter::WritePerTargetConnections(
const ConnectionsMap& connections, const FileStreamMap& streams) const ConnectionsMap& connections, const std::string& fileNameSuffix)
{ {
// the per target connections must be extended by indirect dependencies // the per target connections must be extended by indirect dependencies
ConnectionsMap extendedConnections; ConnectionsMap extendedConnections;
@@ -387,7 +368,9 @@ void cmGraphVizWriter::WritePerTargetConnections(
} }
const Connections& cons = conPerTarget.second; const Connections& cons = conPerTarget.second;
auto fileStream = streams.at(rootItem.AsStr()).get();
std::unique_ptr<cmGeneratedFileStream> fileStream =
this->CreateTargetFile(rootItem, fileNameSuffix);
for (const Connection& con : cons) { for (const Connection& con : cons) {
const cmLinkItem& src = DirFunc::src(con); const cmLinkItem& src = DirFunc::src(con);
@@ -395,6 +378,8 @@ void cmGraphVizWriter::WritePerTargetConnections(
this->WriteNode(*fileStream, con.dst); this->WriteNode(*fileStream, con.dst);
this->WriteConnection(*fileStream, src, dst, con.scopeType); this->WriteConnection(*fileStream, src, dst, con.scopeType);
} }
this->WriteFooter(*fileStream);
} }
} }

View File

@@ -46,9 +46,6 @@ public:
void Write(); void Write();
private: private:
using FileStreamMap =
std::map<std::string, std::unique_ptr<cmGeneratedFileStream>>;
struct Connection struct Connection
{ {
Connection(cmLinkItem s, cmLinkItem d, std::string scope) Connection(cmLinkItem s, cmLinkItem d, std::string scope)
@@ -76,8 +73,8 @@ private:
void WriteNode(cmGeneratedFileStream& fs, cmLinkItem const& item); void WriteNode(cmGeneratedFileStream& fs, cmLinkItem const& item);
void CreateTargetFile(FileStreamMap& fileStreamMap, cmLinkItem const& target, std::unique_ptr<cmGeneratedFileStream> CreateTargetFile(
std::string const& fileNameSuffix = ""); cmLinkItem const& target, std::string const& fileNameSuffix = "");
void WriteConnection(cmGeneratedFileStream& fs, void WriteConnection(cmGeneratedFileStream& fs,
cmLinkItem const& dependerTargetName, cmLinkItem const& dependerTargetName,
@@ -95,7 +92,7 @@ private:
template <typename DirFunc> template <typename DirFunc>
void WritePerTargetConnections(const ConnectionsMap& connections, void WritePerTargetConnections(const ConnectionsMap& connections,
const FileStreamMap& streams); const std::string& fileNameSuffix = "");
bool ItemExcluded(cmLinkItem const& item); bool ItemExcluded(cmLinkItem const& item);
bool ItemNameFilteredOut(std::string const& itemName); bool ItemNameFilteredOut(std::string const& itemName);
@@ -111,8 +108,6 @@ private:
std::string FileName; std::string FileName;
cmGeneratedFileStream GlobalFileStream; cmGeneratedFileStream GlobalFileStream;
FileStreamMap PerTargetFileStreams;
FileStreamMap TargetDependersFileStreams;
ConnectionsMap PerTargetConnections; ConnectionsMap PerTargetConnections;
ConnectionsMap TargetDependersConnections; ConnectionsMap TargetDependersConnections;