mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
// Copyright 2015 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 "base/memory/shared_memory_handle.h"
|
|
|
|
#include <unistd.h>
|
|
|
|
#include "base/posix/eintr_wrapper.h"
|
|
|
|
#if defined(OS_MACOSX) && !defined(OS_IOS)
|
|
namespace base {
|
|
|
|
static_assert(sizeof(SharedMemoryHandle::Type) <=
|
|
sizeof(SharedMemoryHandle::TypeWireFormat),
|
|
"Size of enum SharedMemoryHandle::Type exceeds size of type "
|
|
"transmitted over wire.");
|
|
|
|
SharedMemoryHandle::SharedMemoryHandle() : type_(POSIX), file_descriptor_() {
|
|
}
|
|
|
|
SharedMemoryHandle::SharedMemoryHandle(
|
|
const base::FileDescriptor& file_descriptor)
|
|
: type_(POSIX), file_descriptor_(file_descriptor) {
|
|
}
|
|
|
|
SharedMemoryHandle::SharedMemoryHandle(int fd, bool auto_close)
|
|
: type_(POSIX), file_descriptor_(fd, auto_close) {
|
|
}
|
|
|
|
SharedMemoryHandle::SharedMemoryHandle(const SharedMemoryHandle& handle)
|
|
: type_(handle.type_), file_descriptor_(handle.file_descriptor_) {
|
|
}
|
|
|
|
SharedMemoryHandle& SharedMemoryHandle::operator=(
|
|
const SharedMemoryHandle& handle) {
|
|
if (this == &handle)
|
|
return *this;
|
|
|
|
type_ = handle.type_;
|
|
file_descriptor_ = handle.file_descriptor_;
|
|
return *this;
|
|
}
|
|
|
|
bool SharedMemoryHandle::operator==(const SharedMemoryHandle& handle) const {
|
|
// Invalid handles are always equal, even if they have different types.
|
|
if (!IsValid() && !handle.IsValid())
|
|
return true;
|
|
|
|
return type_ == handle.type_ && file_descriptor_ == handle.file_descriptor_;
|
|
}
|
|
|
|
bool SharedMemoryHandle::operator!=(const SharedMemoryHandle& handle) const {
|
|
return !(*this == handle);
|
|
}
|
|
|
|
SharedMemoryHandle::Type SharedMemoryHandle::GetType() const {
|
|
return type_;
|
|
}
|
|
|
|
bool SharedMemoryHandle::IsValid() const {
|
|
switch (type_) {
|
|
case POSIX:
|
|
return file_descriptor_.fd >= 0;
|
|
case MACH:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void SharedMemoryHandle::SetFileHandle(int fd, bool auto_close) {
|
|
DCHECK_EQ(type_, POSIX);
|
|
file_descriptor_.fd = fd;
|
|
file_descriptor_.auto_close = auto_close;
|
|
}
|
|
|
|
const FileDescriptor SharedMemoryHandle::GetFileDescriptor() const {
|
|
DCHECK_EQ(type_, POSIX);
|
|
return file_descriptor_;
|
|
}
|
|
|
|
SharedMemoryHandle SharedMemoryHandle::Duplicate() const {
|
|
DCHECK_EQ(type_, POSIX);
|
|
int duped_handle = HANDLE_EINTR(dup(file_descriptor_.fd));
|
|
if (duped_handle < 0)
|
|
return SharedMemoryHandle();
|
|
return SharedMemoryHandle(duped_handle, true);
|
|
}
|
|
|
|
} // namespace base
|
|
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|