From c57d1752d471ae8d3735baf3bf78c71c0a888d32 Mon Sep 17 00:00:00 2001 From: Martin Duffy Date: Fri, 24 Jan 2025 09:51:43 -0500 Subject: cmUVProcessChain: Add Detached option for spawning daemons --- Source/cmUVProcessChain.cxx | 12 ++++++++++++ Source/cmUVProcessChain.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx index c64d9a4..2cab632 100644 --- a/Source/cmUVProcessChain.cxx +++ b/Source/cmUVProcessChain.cxx @@ -156,6 +156,12 @@ cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetWorkingDirectory( return *this; } +cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetDetached() +{ + this->Detached = true; + return *this; +} + uv_loop_t* cmUVProcessChainBuilder::GetLoop() const { return this->Loop; @@ -337,6 +343,9 @@ void cmUVProcessChain::InternalData::SpawnProcess( arguments.push_back(nullptr); options.args = const_cast(arguments.data()); options.flags = UV_PROCESS_WINDOWS_HIDE; + if (this->Builder->Detached) { + options.flags |= UV_PROCESS_DETACHED; + } #if UV_VERSION_MAJOR > 1 || \ (UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR >= 48) || \ !defined(CMAKE_USE_SYSTEM_LIBUV) @@ -380,6 +389,9 @@ void cmUVProcessChain::InternalData::SpawnProcess( process.Process.spawn(*this->Loop, options, &process)) < 0) { process.Finish(); } + if (this->Builder->Detached) { + uv_unref((uv_handle_t*)process.Process); + } process.InputPipe.reset(); process.OutputPipe.reset(); } diff --git a/Source/cmUVProcessChain.h b/Source/cmUVProcessChain.h index b28a876..d21fb9e 100644 --- a/Source/cmUVProcessChain.h +++ b/Source/cmUVProcessChain.h @@ -39,6 +39,7 @@ public: cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd); cmUVProcessChainBuilder& SetExternalStream(Stream stdio, FILE* stream); cmUVProcessChainBuilder& SetWorkingDirectory(std::string dir); + cmUVProcessChainBuilder& SetDetached(); uv_loop_t* GetLoop() const; @@ -69,6 +70,7 @@ private: std::vector Processes; std::string WorkingDirectory; bool MergedBuiltinStreams = false; + bool Detached = false; uv_loop_t* Loop = nullptr; }; -- cgit v0.12