mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-01 20:28:37 -06:00
Graphviz: Fix issue with too many open file streams on Windows platform
Fixes #20931
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user