|  | // Copyright 2018 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "mojo/core/scoped_process_handle.h" | 
|  |  | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include <windows.h> | 
|  | #endif | 
|  |  | 
|  | namespace mojo { | 
|  | namespace core { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | base::ProcessHandle GetCurrentProcessHandle() { | 
|  | #if defined(OS_NACL_NONSFI) | 
|  | // Doesn't really matter, it's not going to be used for anything interesting | 
|  | // under NaCl. | 
|  | return 1; | 
|  | #else | 
|  | return base::GetCurrentProcessHandle(); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | ScopedProcessHandle::ScopedProcessHandle() = default; | 
|  |  | 
|  | ScopedProcessHandle::ScopedProcessHandle(base::ProcessHandle handle) | 
|  | : handle_(handle) { | 
|  | DCHECK_NE(handle, GetCurrentProcessHandle()); | 
|  | } | 
|  |  | 
|  | ScopedProcessHandle::ScopedProcessHandle(ScopedProcessHandle&&) = default; | 
|  |  | 
|  | ScopedProcessHandle::~ScopedProcessHandle() = default; | 
|  |  | 
|  | // static | 
|  | ScopedProcessHandle ScopedProcessHandle::CloneFrom(base::ProcessHandle handle) { | 
|  | DCHECK_NE(handle, GetCurrentProcessHandle()); | 
|  | if (handle == base::kNullProcessHandle) | 
|  | return ScopedProcessHandle(); | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | BOOL ok = ::DuplicateHandle(GetCurrentProcessHandle(), handle, | 
|  | GetCurrentProcessHandle(), &handle, 0, FALSE, | 
|  | DUPLICATE_SAME_ACCESS); | 
|  | DCHECK(ok); | 
|  | #endif | 
|  | return ScopedProcessHandle(handle); | 
|  | } | 
|  |  | 
|  | ScopedProcessHandle& ScopedProcessHandle::operator=(ScopedProcessHandle&&) = | 
|  | default; | 
|  |  | 
|  | bool ScopedProcessHandle::is_valid() const { | 
|  | #if defined(OS_WIN) | 
|  | return handle_.IsValid(); | 
|  | #else | 
|  | return handle_ != base::kNullProcessHandle; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | base::ProcessHandle ScopedProcessHandle::get() const { | 
|  | #if defined(OS_WIN) | 
|  | return handle_.Get(); | 
|  | #else | 
|  | return handle_; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | base::ProcessHandle ScopedProcessHandle::release() { | 
|  | #if defined(OS_WIN) | 
|  | return handle_.Take(); | 
|  | #else | 
|  | return handle_; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | ScopedProcessHandle ScopedProcessHandle::Clone() const { | 
|  | if (is_valid()) | 
|  | return CloneFrom(get()); | 
|  | return ScopedProcessHandle(); | 
|  | } | 
|  |  | 
|  | }  // namespace core | 
|  | }  // namespace mojo |