UniquePtrExtensions.cpp (1410B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "UniquePtrExtensions.h" 8 9 #include "mozilla/Assertions.h" 10 #include "mozilla/DebugOnly.h" 11 12 #ifdef XP_WIN 13 # include <windows.h> 14 #else 15 # include <errno.h> 16 # include <unistd.h> 17 #endif 18 19 namespace mozilla { 20 namespace detail { 21 22 void FileHandleDeleter::operator()(FileHandleHelper aHelper) { 23 if (aHelper != nullptr) { 24 DebugOnly<bool> ok; 25 #ifdef XP_WIN 26 ok = CloseHandle(aHelper); 27 #else 28 ok = close(aHelper) == 0 || errno == EINTR; 29 #endif 30 MOZ_ASSERT(ok, "failed to close file handle"); 31 } 32 } 33 34 } // namespace detail 35 36 #ifndef __wasm__ 37 UniqueFileHandle DuplicateFileHandle(detail::FileHandleType aFile) { 38 # ifdef XP_WIN 39 if (aFile != INVALID_HANDLE_VALUE && aFile != NULL) { 40 HANDLE handle; 41 HANDLE currentProcess = ::GetCurrentProcess(); 42 if (::DuplicateHandle(currentProcess, aFile, currentProcess, &handle, 0, 43 false, DUPLICATE_SAME_ACCESS)) { 44 return UniqueFileHandle{handle}; 45 } 46 } 47 # else 48 if (aFile != -1) { 49 return UniqueFileHandle{dup(aFile)}; 50 } 51 # endif 52 return nullptr; 53 } 54 #endif 55 56 } // namespace mozilla