summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-12-07 14:12:56 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-12-07 14:13:57 (GMT)
commitf0deb107c58c852f5d66fa926031c0ac1ffb14e7 (patch)
tree0ac7179ec83d90ab6812d74f57a17697b534cb39
parentf0539c353c20e75e9ce2098f4f50890245cb2732 (diff)
parent0b043a75b7bb92f071dfac6cc95d32fd01080758 (diff)
downloadCMake-f0deb107c58c852f5d66fa926031c0ac1ffb14e7.zip
CMake-f0deb107c58c852f5d66fa926031c0ac1ffb14e7.tar.gz
CMake-f0deb107c58c852f5d66fa926031c0ac1ffb14e7.tar.bz2
Merge topic 'cmuvprocesschain-external-loop'
0b043a75b7 cmUVProcessChain: Add option for external uv_loop_t Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !9040
-rw-r--r--Source/cmUVProcessChain.cxx29
-rw-r--r--Source/cmUVProcessChain.h5
-rw-r--r--Tests/CMakeLib/testUVProcessChain.cxx53
3 files changed, 84 insertions, 3 deletions
diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx
index 655e52a..4c72261 100644
--- a/Source/cmUVProcessChain.cxx
+++ b/Source/cmUVProcessChain.cxx
@@ -38,7 +38,8 @@ struct cmUVProcessChain::InternalData
bool Valid = false;
- cm::uv_loop_ptr Loop;
+ cm::uv_loop_ptr BuiltinLoop;
+ uv_loop_t* Loop;
StreamData InputStreamData;
StreamData OutputStreamData;
@@ -74,6 +75,19 @@ cmUVProcessChainBuilder& cmUVProcessChainBuilder::AddCommand(
return *this;
}
+cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetBuiltinLoop()
+{
+ this->Loop = nullptr;
+ return *this;
+}
+
+cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetExternalLoop(
+ uv_loop_t& loop)
+{
+ this->Loop = &loop;
+ return *this;
+}
+
cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetNoStream(Stream stdio)
{
switch (stdio) {
@@ -135,6 +149,11 @@ cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetWorkingDirectory(
return *this;
}
+uv_loop_t* cmUVProcessChainBuilder::GetLoop() const
+{
+ return this->Loop;
+}
+
cmUVProcessChain cmUVProcessChainBuilder::Start() const
{
cmUVProcessChain chain;
@@ -158,6 +177,13 @@ bool cmUVProcessChain::InternalData::Prepare(
{
this->Builder = builder;
+ if (this->Builder->Loop) {
+ this->Loop = this->Builder->Loop;
+ } else {
+ this->BuiltinLoop.init();
+ this->Loop = this->BuiltinLoop;
+ }
+
auto const& input =
this->Builder->Stdio[cmUVProcessChainBuilder::Stream_INPUT];
auto& inputData = this->InputStreamData;
@@ -353,7 +379,6 @@ void cmUVProcessChain::InternalData::Finish()
cmUVProcessChain::cmUVProcessChain()
: Data(cm::make_unique<InternalData>())
{
- this->Data->Loop.init();
}
cmUVProcessChain::cmUVProcessChain(cmUVProcessChain&& other) noexcept
diff --git a/Source/cmUVProcessChain.h b/Source/cmUVProcessChain.h
index 0f37e7d..139588b 100644
--- a/Source/cmUVProcessChain.h
+++ b/Source/cmUVProcessChain.h
@@ -30,12 +30,16 @@ public:
cmUVProcessChainBuilder& AddCommand(
const std::vector<std::string>& arguments);
+ cmUVProcessChainBuilder& SetBuiltinLoop();
+ cmUVProcessChainBuilder& SetExternalLoop(uv_loop_t& loop);
cmUVProcessChainBuilder& SetNoStream(Stream stdio);
cmUVProcessChainBuilder& SetBuiltinStream(Stream stdio);
cmUVProcessChainBuilder& SetMergedBuiltinStreams();
cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd);
cmUVProcessChainBuilder& SetWorkingDirectory(std::string dir);
+ uv_loop_t* GetLoop() const;
+
cmUVProcessChain Start() const;
private:
@@ -63,6 +67,7 @@ private:
std::vector<ProcessConfiguration> Processes;
std::string WorkingDirectory;
bool MergedBuiltinStreams = false;
+ uv_loop_t* Loop = nullptr;
};
class cmUVProcessChain
diff --git a/Tests/CMakeLib/testUVProcessChain.cxx b/Tests/CMakeLib/testUVProcessChain.cxx
index aab084b..6014889 100644
--- a/Tests/CMakeLib/testUVProcessChain.cxx
+++ b/Tests/CMakeLib/testUVProcessChain.cxx
@@ -297,7 +297,12 @@ bool testUVProcessChainBuiltin(const char* helperCommand)
.AddCommand({ helperCommand, "capitalize" })
.AddCommand({ helperCommand, "dedup" })
.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)
- .SetBuiltinStream(cmUVProcessChainBuilder::Stream_ERROR);
+ .SetBuiltinStream(cmUVProcessChainBuilder::Stream_ERROR)
+ .SetBuiltinLoop();
+ if (builder.GetLoop()) {
+ std::cout << "GetLoop() should return null" << std::endl;
+ return false;
+ }
if (!checkExecution(builder, chain)) {
return false;
@@ -400,6 +405,10 @@ bool testUVProcessChainExternal(const char* helperCommand)
.AddCommand({ helperCommand, "dedup" })
.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, outputPipe[1])
.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, errorPipe[1]);
+ if (builder.GetLoop()) {
+ std::cout << "GetLoop() should return null" << std::endl;
+ return false;
+ }
if (!checkExecution(builder, chain)) {
return false;
@@ -668,6 +677,43 @@ bool testUVProcessChainWait0(const char* helperCommand)
return true;
}
+bool testUVProcessChainExternalLoop(const char* helperCommand)
+{
+ cm::uv_loop_ptr loop;
+ loop.init();
+
+ cmUVProcessChainBuilder builder;
+ builder.AddCommand({ helperCommand, "echo" })
+ .SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)
+ .SetExternalLoop(*loop);
+ if (builder.GetLoop() != loop) {
+ std::cout << "GetLoop() should return external loop" << std::endl;
+ return false;
+ }
+
+ auto chain = builder.Start();
+
+ if (&chain.GetLoop() != loop) {
+ std::cout << "GetLoop() should return external loop" << std::endl;
+ return false;
+ }
+
+ if (!chain.Wait()) {
+ std::cout << "Wait() timed out" << std::endl;
+ return false;
+ }
+
+ cmUVPipeIStream stream(chain.GetLoop(), chain.OutputStream());
+ std::string output = getInput(stream);
+ if (output != "HELLO world!") {
+ std::cout << "Output was \"" << output << "\", expected \"HELLO world!\""
+ << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
int testUVProcessChain(int argc, char** const argv)
{
if (argc < 2) {
@@ -720,5 +766,10 @@ int testUVProcessChain(int argc, char** const argv)
return -1;
}
+ if (!testUVProcessChainExternalLoop(argv[1])) {
+ std::cout << "While executing testUVProcessChainExternalLoop().\n";
+ return -1;
+ }
+
return 0;
}