Commit e3fe6c15 authored by Fabrice de Gans-Riberi's avatar Fabrice de Gans-Riberi Committed by Commit Bot

Fuchsia: Prepare for OS_POSIX removal in mojo/

This cleans up multi-platform code paths selection and prepares for
the removal of OS_POSIX for the Fuchsia build.

Bug: 836416
Change-Id: If44f30dd222572fea1c030a804507f67a1b54e17
Reviewed-on: https://chromium-review.googlesource.com/1033967Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Fabrice de Gans-Riberi <fdegans@chromium.org>
Cr-Commit-Position: refs/heads/master@{#556878}
parent c8758b6b
......@@ -21,6 +21,7 @@
#include "base/strings/nullable_string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/notifications/notification_common.h"
#include "chrome/browser/notifications/notification_display_service_impl.h"
......
......@@ -87,6 +87,12 @@ template("core_impl_source_set") {
"system/user_message_impl.h",
]
if (is_win) {
public += [ "embedder/named_platform_handle_win.h" ]
} else if (is_posix || is_fuchsia) {
public += [ "embedder/named_platform_handle_posix.h" ]
}
sources = [
"embedder/connection_params.cc",
"embedder/entrypoints.cc",
......
......@@ -5,47 +5,12 @@
#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
#include <string>
#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "mojo/edk/system/system_impl_export.h"
namespace mojo {
namespace edk {
#if defined(OS_POSIX)
struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
NamedPlatformHandle() {}
explicit NamedPlatformHandle(const base::StringPiece& name)
: name(name.as_string()) {}
bool is_valid() const { return !name.empty(); }
std::string name;
};
#elif defined(OS_WIN)
struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
NamedPlatformHandle() {}
explicit NamedPlatformHandle(const base::StringPiece& name)
: name(base::UTF8ToUTF16(name)) {}
explicit NamedPlatformHandle(const base::StringPiece16& name)
: name(name.as_string()) {}
bool is_valid() const { return !name.empty(); }
base::string16 pipe_name() const { return L"\\\\.\\pipe\\mojo." + name; }
base::string16 name;
};
#else
#error "Platform not yet supported."
#if defined(OS_WIN)
#include "mojo/edk/embedder/named_platform_handle_win.h"
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
#include "mojo/edk/embedder/named_platform_handle_posix.h"
#endif
} // namespace edk
} // namespace mojo
#endif // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
// 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_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_POSIX_H_
#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_POSIX_H_
#include <string>
#include "base/strings/string_piece.h"
#include "mojo/edk/system/system_impl_export.h"
namespace mojo {
namespace edk {
struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
NamedPlatformHandle() {}
explicit NamedPlatformHandle(const base::StringPiece& name)
: name(name.as_string()) {}
bool is_valid() const { return !name.empty(); }
std::string name;
};
} // namespace edk
} // namespace mojo
#endif // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_POSIX_H_
// 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_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_WIN_H_
#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_WIN_H_
#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/edk/system/system_impl_export.h"
namespace mojo {
namespace edk {
struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
NamedPlatformHandle() {}
explicit NamedPlatformHandle(const base::StringPiece& name)
: name(base::UTF8ToUTF16(name)) {}
explicit NamedPlatformHandle(const base::StringPiece16& name)
: name(name.as_string()) {}
bool is_valid() const { return !name.empty(); }
base::string16 pipe_name() const { return L"\\\\.\\pipe\\mojo." + name; }
base::string16 name;
};
} // namespace edk
} // namespace mojo
#endif // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_WIN_H_
......@@ -5,16 +5,15 @@
#include "mojo/edk/embedder/platform_handle.h"
#include "build/build_config.h"
#if defined(OS_FUCHSIA)
#if defined(OS_WIN)
#include <windows.h>
#elif defined(OS_FUCHSIA)
#include <unistd.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>
#endif
#if defined(OS_POSIX)
#elif defined(OS_POSIX)
#include <unistd.h>
#elif defined(OS_WIN)
#include <windows.h>
#else
#error "Platform not yet supported."
#endif
#include "base/logging.h"
......@@ -26,32 +25,7 @@ void PlatformHandle::CloseIfNecessary() {
if (!is_valid())
return;
#if defined(OS_FUCHSIA)
if (handle != ZX_HANDLE_INVALID) {
zx_status_t result = zx_handle_close(handle);
DCHECK_EQ(ZX_OK, result) << "CloseIfNecessary(zx_handle_close): "
<< zx_status_get_string(result);
handle = ZX_HANDLE_INVALID;
}
if (fd >= 0) {
bool success = (close(fd) == 0);
DPCHECK(success);
fd = -1;
}
#elif defined(OS_POSIX)
if (type == Type::POSIX) {
bool success = (close(handle) == 0);
DPCHECK(success);
handle = -1;
}
#if defined(OS_MACOSX) && !defined(OS_IOS)
else if (type == Type::MACH) {
kern_return_t rv = mach_port_deallocate(mach_task_self(), port);
DPCHECK(rv == KERN_SUCCESS);
port = MACH_PORT_NULL;
}
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
#elif defined(OS_WIN)
#if defined(OS_WIN)
if (owning_process != base::GetCurrentProcessHandle()) {
// This handle may have been duplicated to a new target process but not yet
// sent there. In this case CloseHandle should NOT be called. From MSDN
......@@ -84,9 +58,34 @@ void PlatformHandle::CloseIfNecessary() {
bool success = !!CloseHandle(handle);
DPCHECK(success);
handle = INVALID_HANDLE_VALUE;
#elif defined(OS_FUCHSIA)
if (handle != ZX_HANDLE_INVALID) {
zx_status_t result = zx_handle_close(handle);
DCHECK_EQ(ZX_OK, result) << "CloseIfNecessary(zx_handle_close): "
<< zx_status_get_string(result);
handle = ZX_HANDLE_INVALID;
}
if (fd >= 0) {
bool success = (close(fd) == 0);
DPCHECK(success);
fd = -1;
}
#elif defined(OS_POSIX)
if (type == Type::POSIX) {
bool success = (close(handle) == 0);
DPCHECK(success);
handle = -1;
}
#if defined(OS_MACOSX) && !defined(OS_IOS)
else if (type == Type::MACH) {
kern_return_t rv = mach_port_deallocate(mach_task_self(), port);
DPCHECK(rv == KERN_SUCCESS);
port = MACH_PORT_NULL;
}
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
#else
#error "Platform not yet supported."
#endif
#endif // defined(OS_WIN)
}
} // namespace edk
......
......@@ -12,11 +12,11 @@
#include <windows.h>
#include "base/process/process_handle.h"
#elif defined(OS_MACOSX) && !defined(OS_IOS)
#include <mach/mach.h>
#elif defined(OS_FUCHSIA)
#include <fdio/limits.h>
#include <zircon/syscalls.h>
#elif defined(OS_MACOSX) && !defined(OS_IOS)
#include <mach/mach.h>
#endif
#include "base/logging.h"
......@@ -24,7 +24,29 @@
namespace mojo {
namespace edk {
#if defined(OS_FUCHSIA)
#if defined(OS_WIN)
struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
PlatformHandle() : PlatformHandle(INVALID_HANDLE_VALUE) {}
explicit PlatformHandle(HANDLE handle)
: handle(handle), owning_process(base::GetCurrentProcessHandle()) {}
void CloseIfNecessary();
bool is_valid() const { return handle != INVALID_HANDLE_VALUE; }
HANDLE handle;
// A Windows HANDLE may be duplicated to another process but not yet sent to
// that process. This tracks the handle's owning process and this process
// handle (if not null, i.e., the current process) is *owned* by this
// PlatformHandle.
base::ProcessHandle owning_process;
// A Windows HANDLE may be an unconnected named pipe. In this case, we need to
// wait for a connection before communicating on the pipe.
bool needs_connection = false;
};
#elif defined(OS_FUCHSIA)
// TODO(fuchsia): Find a clean way to share this with the POSIX version.
// |zx_handle_t| is a typedef of |int|, so we only allow PlatformHandle to be
// created via explicit For<type>() creator functions.
......@@ -94,28 +116,6 @@ struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
mach_port_t port = MACH_PORT_NULL;
#endif
};
#elif defined(OS_WIN)
struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
PlatformHandle() : PlatformHandle(INVALID_HANDLE_VALUE) {}
explicit PlatformHandle(HANDLE handle)
: handle(handle), owning_process(base::GetCurrentProcessHandle()) {}
void CloseIfNecessary();
bool is_valid() const { return handle != INVALID_HANDLE_VALUE; }
HANDLE handle;
// A Windows HANDLE may be duplicated to another process but not yet sent to
// that process. This tracks the handle's owning process and this process
// handle (if not null, i.e., the current process) is *owned* by this
// PlatformHandle.
base::ProcessHandle owning_process;
// A Windows HANDLE may be an unconnected named pipe. In this case, we need to
// wait for a connection before communicating on the pipe.
bool needs_connection = false;
};
#else
#error "Platform not yet supported."
#endif
......
......@@ -23,25 +23,25 @@
#include <windows.h>
#endif
#if defined(OS_POSIX)
#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR
#elif defined(OS_WIN)
#if defined(OS_WIN)
#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR
#endif
#if defined(OS_MACOSX) && !defined(OS_IOS)
#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT
#elif defined(OS_FUCHSIA)
#if defined(OS_FUCHSIA)
#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE \
MOJO_PLATFORM_HANDLE_TYPE_FUCHSIA_HANDLE
#else
#elif defined(OS_MACOSX) && !defined(OS_IOS)
#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT
#elif defined(OS_WIN) || defined(OS_POSIX)
#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE SIMPLE_PLATFORM_HANDLE_TYPE
#endif
uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
#if defined(OS_WIN)
return reinterpret_cast<uint64_t>(file);
#else
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
return static_cast<uint64_t>(file);
#endif
}
......@@ -49,7 +49,7 @@ uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
base::PlatformFile PlatformFileFromPlatformHandleValue(uint64_t value) {
#if defined(OS_WIN)
return reinterpret_cast<base::PlatformFile>(value);
#else
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
return static_cast<base::PlatformFile>(value);
#endif
}
......@@ -126,12 +126,14 @@ TEST_F(PlatformWrapperTest, WrapPlatformSharedBufferHandle) {
MojoPlatformHandle os_buffer;
os_buffer.struct_size = sizeof(MojoPlatformHandle);
os_buffer.type = SHARED_BUFFER_PLATFORM_HANDLE_TYPE;
#if defined(OS_MACOSX) && !defined(OS_IOS)
os_buffer.value = static_cast<uint64_t>(memory_handle.GetMemoryObject());
#elif defined(OS_WIN)
#if defined(OS_WIN)
os_buffer.value = reinterpret_cast<uint64_t>(memory_handle.GetHandle());
#else
#elif defined(OS_MACOSX) && !defined(OS_IOS)
os_buffer.value = static_cast<uint64_t>(memory_handle.GetMemoryObject());
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
os_buffer.value = static_cast<uint64_t>(memory_handle.GetHandle());
#else
#error Unsupported platform
#endif
MojoSharedBufferGuid mojo_guid;
......@@ -179,23 +181,23 @@ DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadPlatformSharedBuffer,
base::UnguessableToken guid =
base::UnguessableToken::Deserialize(mojo_guid.high, mojo_guid.low);
#if defined(OS_MACOSX) && !defined(OS_IOS)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT, os_buffer.type);
#if defined(OS_WIN)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE, os_buffer.type);
base::SharedMemoryHandle memory_handle(
static_cast<mach_port_t>(os_buffer.value), size, guid);
reinterpret_cast<HANDLE>(os_buffer.value), size, guid);
#elif defined(OS_FUCHSIA)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_FUCHSIA_HANDLE, os_buffer.type);
base::SharedMemoryHandle memory_handle(
static_cast<zx_handle_t>(os_buffer.value), size, guid);
#elif defined(OS_MACOSX) && !defined(OS_IOS)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT, os_buffer.type);
base::SharedMemoryHandle memory_handle(
static_cast<mach_port_t>(os_buffer.value), size, guid);
#elif defined(OS_POSIX)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR, os_buffer.type);
base::SharedMemoryHandle memory_handle(
base::FileDescriptor(static_cast<int>(os_buffer.value), false), size,
guid);
#elif defined(OS_WIN)
ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE, os_buffer.type);
base::SharedMemoryHandle memory_handle(
reinterpret_cast<HANDLE>(os_buffer.value), size, guid);
#endif
base::SharedMemory memory(memory_handle, read_only);
......
......@@ -22,6 +22,7 @@
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/memory/writable_shared_memory_region.h"
#include "base/process/process_handle.h"
#include "build/build_config.h"
#include "mojo/public/c/system/platform_handle.h"
#include "mojo/public/cpp/system/buffer.h"
#include "mojo/public/cpp/system/handle.h"
......@@ -33,28 +34,32 @@
namespace mojo {
#if defined(OS_POSIX)
#if defined(OS_WIN)
const MojoPlatformHandleType kPlatformFileHandleType =
MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
#if defined(OS_MACOSX) && !defined(OS_IOS)
const MojoPlatformHandleType kPlatformSharedBufferHandleType =
MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
#elif defined(OS_FUCHSIA)
const MojoPlatformHandleType kPlatformFileHandleType =
MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
const MojoPlatformHandleType kPlatformSharedBufferHandleType =
MOJO_PLATFORM_HANDLE_TYPE_FUCHSIA_HANDLE;
#elif defined(OS_POSIX)
const MojoPlatformHandleType kPlatformFileHandleType =
MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
#if defined(OS_MACOSX) && !defined(OS_IOS)
const MojoPlatformHandleType kPlatformSharedBufferHandleType =
MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
#else
const MojoPlatformHandleType kPlatformSharedBufferHandleType =
MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
#elif defined(OS_WIN)
const MojoPlatformHandleType kPlatformFileHandleType =
MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
const MojoPlatformHandleType kPlatformSharedBufferHandleType =
MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
#endif // defined(OS_POSIX)
#endif // defined(OS_WIN)
// Used to specify the protection status of a base::SharedMemoryHandle memory
// handle wrapped or unwrapped by mojo::WrapSharedMemoryHandle or
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment