// 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_