From 87ffba440609f5045821481670f9183d1e49fe1d Mon Sep 17 00:00:00 2001 From: Nika Layzell Date: Tue, 1 Oct 2024 22:21:47 +0000 Subject: [PATCH] Bug 1440207 - Part 2: Add a cross-platform DuplicateFileHandle method to MFBT, r=glandium This is convenient in cross-platform code which needs to work with `UniqueFileHandle` objects. `dup` is not supported by wasi, so the method isn't available there. Differential Revision: https://phabricator.services.mozilla.com/D221370 --- mfbt/UniquePtrExtensions.cpp | 21 +++++++++++++++++++++ mfbt/UniquePtrExtensions.h | 8 ++++++++ 2 files changed, 29 insertions(+) diff --git a/mfbt/UniquePtrExtensions.cpp b/mfbt/UniquePtrExtensions.cpp index 229c9421960d..3b509fb9e0ab 100644 --- a/mfbt/UniquePtrExtensions.cpp +++ b/mfbt/UniquePtrExtensions.cpp @@ -32,4 +32,25 @@ void FileHandleDeleter::operator()(FileHandleHelper aHelper) { } } // namespace detail + +#ifndef __wasm__ +UniqueFileHandle DuplicateFileHandle(detail::FileHandleType aFile) { +# ifdef XP_WIN + if (aFile != INVALID_HANDLE_VALUE && aFile != NULL) { + HANDLE handle; + HANDLE currentProcess = ::GetCurrentProcess(); + if (::DuplicateHandle(currentProcess, aFile, currentProcess, &handle, 0, + false, DUPLICATE_SAME_ACCESS)) { + return UniqueFileHandle{handle}; + } + } +# else + if (aFile != -1) { + return UniqueFileHandle{dup(aFile)}; + } +# endif + return nullptr; +} +#endif + } // namespace mozilla diff --git a/mfbt/UniquePtrExtensions.h b/mfbt/UniquePtrExtensions.h index 2679440e501e..c93f76a00871 100644 --- a/mfbt/UniquePtrExtensions.h +++ b/mfbt/UniquePtrExtensions.h @@ -220,6 +220,14 @@ using UniqueFreePtr = UniquePtr>; using UniqueFileHandle = UniquePtr; +#ifndef __wasm__ +// WASI does not have `dup` +MFBT_API UniqueFileHandle DuplicateFileHandle(detail::FileHandleType aFile); +inline UniqueFileHandle DuplicateFileHandle(const UniqueFileHandle& aFile) { + return DuplicateFileHandle(aFile.get()); +} +#endif + #if defined(XP_DARWIN) && !defined(RUST_BINDGEN) // A RAII class for a Mach port that names a send right. using UniqueMachSendRight =