|  | // 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. | 
|  |  | 
|  | #ifndef MOJO_CORE_SCOPED_PROCESS_HANDLE_H_ | 
|  | #define MOJO_CORE_SCOPED_PROCESS_HANDLE_H_ | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/process/process_handle.h" | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include "base/win/scoped_handle.h" | 
|  | #endif | 
|  |  | 
|  | namespace mojo { | 
|  | namespace core { | 
|  |  | 
|  | // Wraps a |base::ProcessHandle| with additional scoped lifetime semantics on | 
|  | // applicable platforms. For platforms where process handles aren't ownable | 
|  | // references, this is just a wrapper around |base::ProcessHandle|. | 
|  | // | 
|  | // This essentially exists to support passing around process handles internally | 
|  | // in a generic way while also supporting Windows process handle ownership | 
|  | // semantics. | 
|  | // | 
|  | // A ScopedProcessHandle will never refer to the current process, and | 
|  | // constructing a ScopedProcessHandle over the current process's handle is | 
|  | // considered an error. | 
|  | class ScopedProcessHandle { | 
|  | public: | 
|  | ScopedProcessHandle(); | 
|  |  | 
|  | // Assumes ownership of |handle|. | 
|  | explicit ScopedProcessHandle(base::ProcessHandle handle); | 
|  |  | 
|  | ScopedProcessHandle(ScopedProcessHandle&&); | 
|  |  | 
|  | ~ScopedProcessHandle(); | 
|  |  | 
|  | // Creates a new ScopedProcessHandle from a clone of |handle|. | 
|  | static ScopedProcessHandle CloneFrom(base::ProcessHandle handle); | 
|  |  | 
|  | ScopedProcessHandle& operator=(ScopedProcessHandle&&); | 
|  |  | 
|  | bool is_valid() const; | 
|  | base::ProcessHandle get() const; | 
|  | base::ProcessHandle release(); | 
|  |  | 
|  | ScopedProcessHandle Clone() const; | 
|  |  | 
|  | private: | 
|  | #if defined(OS_WIN) | 
|  | base::win::ScopedHandle handle_; | 
|  | #else | 
|  | base::ProcessHandle handle_ = base::kNullProcessHandle; | 
|  | #endif | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ScopedProcessHandle); | 
|  | }; | 
|  |  | 
|  | }  // namespace core | 
|  | }  // namespace mojo | 
|  |  | 
|  | #endif  // MOJO_CORE_SCOPED_PROCESS_HANDLE_H_ |