Remove unused _fuchsia files
Change-Id: Iaf45ff39d92ebc1f894ace9236724549b913e0e8
Reviewed-on: https://gn-review.googlesource.com/1481
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/base/base_paths_fuchsia.cc b/base/base_paths_fuchsia.cc
deleted file mode 100644
index afe449f..0000000
--- a/base/base_paths_fuchsia.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 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/base_paths.h"
-
-#include <stdlib.h>
-
-#include "base/base_paths_fuchsia.h"
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/path_service.h"
-#include "base/process/process.h"
-
-namespace base {
-namespace {
-
-constexpr char kPackageRoot[] = "/pkg";
-
-} // namespace
-
-base::FilePath GetPackageRoot() {
- base::FilePath path_obj(kPackageRoot);
-
- // Fuchsia's appmgr will set argv[0] to a fully qualified executable path
- // under /pkg for packaged binaries.
- if (path_obj.IsParent(base::CommandLine::ForCurrentProcess()->GetProgram())) {
- return path_obj;
- } else {
- return base::FilePath();
- }
-}
-
-bool PathProviderFuchsia(int key, FilePath* result) {
- switch (key) {
- case FILE_MODULE:
- NOTIMPLEMENTED();
- return false;
- case FILE_EXE:
- *result = CommandLine::ForCurrentProcess()->GetProgram();
- return true;
- case DIR_SOURCE_ROOT:
- *result = GetPackageRoot();
- return true;
- case DIR_APP_DATA:
- // TODO(https://crbug.com/840598): Switch to /data when minfs supports
- // mmap().
- DLOG(WARNING) << "Using /tmp as app data dir, changes will NOT be "
- "persisted! (crbug.com/840598)";
- *result = FilePath("/tmp");
- return true;
- case DIR_CACHE:
- *result = FilePath("/data");
- return true;
- case DIR_ASSETS:
- *result = GetPackageRoot();
- return true;
- }
- return false;
-}
-
-} // namespace base
diff --git a/base/base_paths_fuchsia.h b/base/base_paths_fuchsia.h
deleted file mode 100644
index a2d4194..0000000
--- a/base/base_paths_fuchsia.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 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 BASE_BASE_PATHS_FUCHSIA_H_
-#define BASE_BASE_PATHS_FUCHSIA_H_
-
-#include "base/base_export.h"
-#include "base/files/file_path.h"
-
-namespace base {
-
-// These can be used with the PathService to access various special
-// directories and files.
-enum {
- PATH_FUCHSIA_START = 1200,
-
- // Path to the directory which contains application libraries and resources.
- DIR_FUCHSIA_RESOURCES,
-
- // Path to the directory which contains application user data.
- DIR_APP_DATA,
-
- PATH_FUCHSIA_END,
-};
-
-// If running inside a package, returns a FilePath of the root path
-// of the currently deployed package.
-// Otherwise returns an empty FilePath.
-BASE_EXPORT base::FilePath GetPackageRoot();
-
-} // namespace base
-
-#endif // BASE_BASE_PATHS_FUCHSIA_H_
diff --git a/base/debug/stack_trace_fuchsia.cc b/base/debug/stack_trace_fuchsia.cc
deleted file mode 100644
index f996933..0000000
--- a/base/debug/stack_trace_fuchsia.cc
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2017 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/debug/stack_trace.h"
-
-#include <link.h>
-#include <stddef.h>
-#include <string.h>
-#include <threads.h>
-#include <unwind.h>
-#include <zircon/crashlogger.h>
-#include <zircon/process.h>
-#include <zircon/syscalls.h>
-#include <zircon/syscalls/definitions.h>
-#include <zircon/syscalls/port.h>
-#include <zircon/types.h>
-
-#include <algorithm>
-#include <iomanip>
-#include <iostream>
-
-#include "base/logging.h"
-
-namespace base {
-namespace debug {
-
-namespace {
-
-const char kProcessNamePrefix[] = "app:";
-const size_t kProcessNamePrefixLen = arraysize(kProcessNamePrefix) - 1;
-
-struct BacktraceData {
- void** trace_array;
- size_t* count;
- size_t max;
-};
-
-_Unwind_Reason_Code UnwindStore(struct _Unwind_Context* context,
- void* user_data) {
- BacktraceData* data = reinterpret_cast<BacktraceData*>(user_data);
- uintptr_t pc = _Unwind_GetIP(context);
- data->trace_array[*data->count] = reinterpret_cast<void*>(pc);
- *data->count += 1;
- if (*data->count == data->max)
- return _URC_END_OF_STACK;
- return _URC_NO_REASON;
-}
-
-// Stores and queries debugging symbol map info for the current process.
-class SymbolMap {
- public:
- struct Entry {
- void* addr;
- char name[ZX_MAX_NAME_LEN + kProcessNamePrefixLen];
- };
-
- SymbolMap();
- ~SymbolMap() = default;
-
- // Gets the symbol map entry for |address|. Returns null if no entry could be
- // found for the address, or if the symbol map could not be queried.
- Entry* GetForAddress(void* address);
-
- private:
- // Component builds of Chrome pull about 250 shared libraries (on Linux), so
- // 512 entries should be enough in most cases.
- static const size_t kMaxMapEntries = 512;
-
- void Populate();
-
- // Sorted in descending order by address, for lookup purposes.
- Entry entries_[kMaxMapEntries];
-
- size_t count_ = 0;
- bool valid_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(SymbolMap);
-};
-
-SymbolMap::SymbolMap() {
- Populate();
-}
-
-SymbolMap::Entry* SymbolMap::GetForAddress(void* address) {
- if (!valid_) {
- return nullptr;
- }
-
- // Working backwards in the address space, return the first map entry whose
- // address comes before |address| (thereby enclosing it.)
- for (size_t i = 0; i < count_; ++i) {
- if (address >= entries_[i].addr) {
- return &entries_[i];
- }
- }
- return nullptr;
-}
-
-void SymbolMap::Populate() {
- zx_handle_t process = zx_process_self();
-
- // Try to fetch the name of the process' main executable, which was set as the
- // name of the |process| kernel object.
- // TODO(wez): Object names can only have up to ZX_MAX_NAME_LEN characters, so
- // if we keep hitting problems with truncation, find a way to plumb argv[0]
- // through to here instead, e.g. using CommandLine::GetProgramName().
- char app_name[arraysize(SymbolMap::Entry::name)];
- strcpy(app_name, kProcessNamePrefix);
- zx_status_t status = zx_object_get_property(
- process, ZX_PROP_NAME, app_name + kProcessNamePrefixLen,
- sizeof(app_name) - kProcessNamePrefixLen);
- if (status != ZX_OK) {
- DPLOG(WARNING)
- << "Couldn't get name, falling back to 'app' for program name: "
- << status;
- strlcat(app_name, "app", sizeof(app_name));
- }
-
- // Retrieve the debug info struct.
- uintptr_t debug_addr;
- status = zx_object_get_property(process, ZX_PROP_PROCESS_DEBUG_ADDR,
- &debug_addr, sizeof(debug_addr));
- if (status != ZX_OK) {
- DPLOG(ERROR) << "Couldn't get symbol map for process: " << status;
- return;
- }
- r_debug* debug_info = reinterpret_cast<r_debug*>(debug_addr);
-
- // Get the link map from the debug info struct.
- link_map* lmap = reinterpret_cast<link_map*>(debug_info->r_map);
- if (!lmap) {
- DPLOG(ERROR) << "Null link_map for process.";
- return;
- }
-
- // Copy the contents of the link map linked list to |entries_|.
- while (lmap != nullptr) {
- if (count_ >= arraysize(entries_)) {
- break;
- }
- SymbolMap::Entry* next_entry = &entries_[count_];
- count_++;
-
- next_entry->addr = reinterpret_cast<void*>(lmap->l_addr);
- char* name_to_use = lmap->l_name[0] ? lmap->l_name : app_name;
- strlcpy(next_entry->name, name_to_use, sizeof(next_entry->name));
- lmap = lmap->l_next;
- }
-
- std::sort(
- &entries_[0], &entries_[count_ - 1],
- [](const Entry& a, const Entry& b) -> bool { return a.addr >= b.addr; });
-
- valid_ = true;
-}
-
-} // namespace
-
-// static
-bool EnableInProcessStackDumping() {
- // StackTrace works to capture the current stack (e.g. for diagnostics added
- // to code), but for local capture and print of backtraces, we just let the
- // system crashlogger take over. It handles printing out a nicely formatted
- // backtrace with dso information, relative offsets, etc. that we can then
- // filter with addr2line in the run script to get file/line info.
- return true;
-}
-
-StackTrace::StackTrace(size_t count) : count_(0) {
- BacktraceData data = {&trace_[0], &count_,
- std::min(count, static_cast<size_t>(kMaxTraces))};
- _Unwind_Backtrace(&UnwindStore, &data);
-}
-
-void StackTrace::Print() const {
- OutputToStream(&std::cerr);
-}
-
-// Sample stack trace output is designed to be similar to Fuchsia's crashlogger:
-// bt#00: pc 0x1527a058aa00 (app:/system/base_unittests,0x18bda00)
-// bt#01: pc 0x1527a0254b5c (app:/system/base_unittests,0x1587b5c)
-// bt#02: pc 0x15279f446ece (app:/system/base_unittests,0x779ece)
-// ...
-// bt#21: pc 0x1527a05b51b4 (app:/system/base_unittests,0x18e81b4)
-// bt#22: pc 0x54fdbf3593de (libc.so,0x1c3de)
-// bt#23: end
-void StackTrace::OutputToStream(std::ostream* os) const {
- SymbolMap map;
-
- size_t i = 0;
- for (; (i < count_) && os->good(); ++i) {
- SymbolMap::Entry* entry = map.GetForAddress(trace_[i]);
- if (entry) {
- size_t offset = reinterpret_cast<uintptr_t>(trace_[i]) -
- reinterpret_cast<uintptr_t>(entry->addr);
- *os << "bt#" << std::setw(2) << std::setfill('0') << i << std::setw(0)
- << ": pc " << trace_[i] << " (" << entry->name << ",0x" << std::hex
- << offset << std::dec << std::setw(0) << ")\n";
- } else {
- // Fallback if the DSO map isn't available.
- // Logged PC values are absolute memory addresses, and the shared object
- // name is not emitted.
- *os << "bt#" << std::setw(2) << std::setfill('0') << i << std::setw(0)
- << ": pc " << trace_[i] << "\n";
- }
- }
-
- (*os) << "bt#" << std::setw(2) << i << ": end\n";
-}
-
-} // namespace debug
-} // namespace base
diff --git a/base/files/file_path_watcher_fuchsia.cc b/base/files/file_path_watcher_fuchsia.cc
deleted file mode 100644
index 53c927e..0000000
--- a/base/files/file_path_watcher_fuchsia.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 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/files/file_path_watcher.h"
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-
-namespace base {
-
-namespace {
-
-class FilePathWatcherImpl : public FilePathWatcher::PlatformDelegate {
- public:
- FilePathWatcherImpl() {}
- ~FilePathWatcherImpl() override {}
-
- bool Watch(const FilePath& path,
- bool recursive,
- const FilePathWatcher::Callback& callback) override;
-
- void Cancel() override;
-
- private:
- FilePathWatcher::Callback callback_;
- FilePath target_;
-
- DISALLOW_COPY_AND_ASSIGN(FilePathWatcherImpl);
-};
-
-bool FilePathWatcherImpl::Watch(const FilePath& path,
- bool recursive,
- const FilePathWatcher::Callback& callback) {
- DCHECK(!callback.is_null());
- DCHECK(callback_.is_null());
-
- callback_ = callback;
- NOTIMPLEMENTED();
- return false;
-}
-
-void FilePathWatcherImpl::Cancel() {
- NOTIMPLEMENTED();
-}
-
-} // namespace
-
-FilePathWatcher::FilePathWatcher() {
- sequence_checker_.DetachFromSequence();
- impl_ = std::make_unique<FilePathWatcherImpl>();
-}
-
-} // namespace base
diff --git a/base/message_loop/message_pump_fuchsia.cc b/base/message_loop/message_pump_fuchsia.cc
deleted file mode 100644
index b9af643..0000000
--- a/base/message_loop/message_pump_fuchsia.cc
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright 2017 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/message_loop/message_pump_fuchsia.h"
-
-#include <fdio/io.h>
-#include <fdio/private.h>
-#include <zircon/status.h>
-#include <zircon/syscalls.h>
-
-#include "base/auto_reset.h"
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/logging.h"
-
-namespace base {
-
-MessagePumpFuchsia::ZxHandleWatchController::ZxHandleWatchController(
- const Location& from_here)
- : async_wait_t({}), created_from_location_(from_here) {}
-
-MessagePumpFuchsia::ZxHandleWatchController::~ZxHandleWatchController() {
- if (!StopWatchingZxHandle())
- NOTREACHED();
-}
-
-bool MessagePumpFuchsia::ZxHandleWatchController::WaitBegin() {
- DCHECK(!handler);
- async_wait_t::handler = &HandleSignal;
-
- zx_status_t status = async_begin_wait(&weak_pump_->async_dispatcher_, this);
- if (status != ZX_OK) {
- ZX_DLOG(ERROR, status) << "async_begin_wait() failed";
- async_wait_t::handler = nullptr;
- return false;
- }
-
- return true;
-}
-
-bool MessagePumpFuchsia::ZxHandleWatchController::StopWatchingZxHandle() {
- if (was_stopped_) {
- DCHECK(!*was_stopped_);
- *was_stopped_ = true;
-
- // |was_stopped_| points at a value stored on the stack, which will go out
- // of scope. MessagePumpFuchsia::Run() will reset it only if the value is
- // false. So we need to reset this pointer here as well, to make sure it's
- // not used again.
- was_stopped_ = nullptr;
- }
-
- // If the pump is gone then there is nothing to cancel.
- if (!weak_pump_)
- return true;
-
- // |handler| is set when waiting for a signal.
- if (!handler)
- return true;
-
- async_wait_t::handler = nullptr;
-
- zx_status_t result = async_cancel_wait(&weak_pump_->async_dispatcher_, this);
- ZX_DLOG_IF(ERROR, result != ZX_OK, result) << "async_cancel_wait failed";
- return result == ZX_OK;
-}
-
-// static
-void MessagePumpFuchsia::ZxHandleWatchController::HandleSignal(
- async_t* async,
- async_wait_t* wait,
- zx_status_t status,
- const zx_packet_signal_t* signal) {
- if (status != ZX_OK) {
- ZX_LOG(WARNING, status) << "async wait failed";
- return;
- }
-
- ZxHandleWatchController* controller =
- static_cast<ZxHandleWatchController*>(wait);
- DCHECK_EQ(controller->handler, &HandleSignal);
- controller->handler = nullptr;
-
- // |signal| can include other spurious things, in particular, that an fd
- // is writable, when we only asked to know when it was readable. In that
- // case, we don't want to call both the CanWrite and CanRead callback,
- // when the caller asked for only, for example, readable callbacks. So,
- // mask with the events that we actually wanted to know about.
- zx_signals_t signals = signal->trigger & signal->observed;
- DCHECK_NE(0u, signals);
-
- // In the case of a persistent Watch, the Watch may be stopped and
- // potentially deleted by the caller within the callback, in which case
- // |controller| should not be accessed again, and we mustn't continue the
- // watch. We check for this with a bool on the stack, which the Watch
- // receives a pointer to.
- bool was_stopped = false;
- controller->was_stopped_ = &was_stopped;
-
- controller->watcher_->OnZxHandleSignalled(wait->object, signals);
-
- if (was_stopped)
- return;
-
- controller->was_stopped_ = nullptr;
-
- if (controller->persistent_)
- controller->WaitBegin();
-}
-
-void MessagePumpFuchsia::FdWatchController::OnZxHandleSignalled(
- zx_handle_t handle,
- zx_signals_t signals) {
- uint32_t events;
- __fdio_wait_end(io_, signals, &events);
-
- // Each |watcher_| callback we invoke may stop or delete |this|. The pump has
- // set |was_stopped_| to point to a safe location on the calling stack, so we
- // can use that to detect being stopped mid-callback and avoid doing further
- // work that would touch |this|.
- bool* was_stopped = was_stopped_;
- if (events & FDIO_EVT_WRITABLE)
- watcher_->OnFileCanWriteWithoutBlocking(fd_);
- if (!*was_stopped && (events & FDIO_EVT_READABLE))
- watcher_->OnFileCanReadWithoutBlocking(fd_);
-
- // Don't add additional work here without checking |*was_stopped_| again.
-}
-
-MessagePumpFuchsia::FdWatchController::FdWatchController(
- const Location& from_here)
- : FdWatchControllerInterface(from_here),
- ZxHandleWatchController(from_here) {}
-
-MessagePumpFuchsia::FdWatchController::~FdWatchController() {
- if (!StopWatchingFileDescriptor())
- NOTREACHED();
-}
-
-bool MessagePumpFuchsia::FdWatchController::WaitBegin() {
- // Refresh the |handle_| and |desired_signals_| from the mxio for the fd.
- // Some types of fdio map read/write events to different signals depending on
- // their current state, so we must do this every time we begin to wait.
- __fdio_wait_begin(io_, desired_events_, &object, &trigger);
- if (async_wait_t::object == ZX_HANDLE_INVALID) {
- DLOG(ERROR) << "fdio_wait_begin failed";
- return false;
- }
-
- return MessagePumpFuchsia::ZxHandleWatchController::WaitBegin();
-}
-
-bool MessagePumpFuchsia::FdWatchController::StopWatchingFileDescriptor() {
- bool success = StopWatchingZxHandle();
- if (io_) {
- __fdio_release(io_);
- io_ = nullptr;
- }
- return success;
-}
-
-MessagePumpFuchsia::MessagePumpFuchsia() : weak_factory_(this) {}
-
-MessagePumpFuchsia::~MessagePumpFuchsia() = default;
-
-bool MessagePumpFuchsia::WatchFileDescriptor(int fd,
- bool persistent,
- int mode,
- FdWatchController* controller,
- FdWatcher* delegate) {
- DCHECK_GE(fd, 0);
- DCHECK(controller);
- DCHECK(delegate);
-
- if (!controller->StopWatchingFileDescriptor())
- NOTREACHED();
-
- controller->fd_ = fd;
- controller->watcher_ = delegate;
-
- DCHECK(!controller->io_);
- controller->io_ = __fdio_fd_to_io(fd);
- if (!controller->io_) {
- DLOG(ERROR) << "Failed to get IO for FD";
- return false;
- }
-
- switch (mode) {
- case WATCH_READ:
- controller->desired_events_ = FDIO_EVT_READABLE;
- break;
- case WATCH_WRITE:
- controller->desired_events_ = FDIO_EVT_WRITABLE;
- break;
- case WATCH_READ_WRITE:
- controller->desired_events_ = FDIO_EVT_READABLE | FDIO_EVT_WRITABLE;
- break;
- default:
- NOTREACHED() << "unexpected mode: " << mode;
- return false;
- }
-
- // Pass dummy |handle| and |signals| values to WatchZxHandle(). The real
- // values will be populated by FdWatchController::WaitBegin(), before actually
- // starting the wait operation.
- return WatchZxHandle(ZX_HANDLE_INVALID, persistent, 1, controller,
- controller);
-}
-
-bool MessagePumpFuchsia::WatchZxHandle(zx_handle_t handle,
- bool persistent,
- zx_signals_t signals,
- ZxHandleWatchController* controller,
- ZxHandleWatcher* delegate) {
- DCHECK_NE(0u, signals);
- DCHECK(controller);
- DCHECK(delegate);
- DCHECK(handle == ZX_HANDLE_INVALID ||
- controller->async_wait_t::object == ZX_HANDLE_INVALID ||
- handle == controller->async_wait_t::object);
-
- if (!controller->StopWatchingZxHandle())
- NOTREACHED();
-
- controller->async_wait_t::object = handle;
- controller->persistent_ = persistent;
- controller->async_wait_t::trigger = signals;
- controller->watcher_ = delegate;
-
- controller->weak_pump_ = weak_factory_.GetWeakPtr();
-
- return controller->WaitBegin();
-}
-
-bool MessagePumpFuchsia::HandleEvents(zx_time_t deadline) {
- zx_status_t status = async_dispatcher_.DispatchOrWaitUntil(deadline);
- switch (status) {
- // Return true if some tasks or events were dispatched or if the dispatcher
- // was stopped by ScheduleWork().
- case ZX_OK:
- case ZX_ERR_CANCELED:
- return true;
-
- case ZX_ERR_TIMED_OUT:
- return false;
-
- default:
- ZX_DLOG(DCHECK, status) << "unexpected wait status";
- return false;
- }
-}
-
-void MessagePumpFuchsia::Run(Delegate* delegate) {
- AutoReset<bool> auto_reset_keep_running(&keep_running_, true);
-
- for (;;) {
- bool did_work = delegate->DoWork();
- if (!keep_running_)
- break;
-
- did_work |= delegate->DoDelayedWork(&delayed_work_time_);
- if (!keep_running_)
- break;
-
- did_work |= HandleEvents(/*deadline=*/0);
- if (!keep_running_)
- break;
-
- if (did_work)
- continue;
-
- did_work = delegate->DoIdleWork();
- if (!keep_running_)
- break;
-
- if (did_work)
- continue;
-
- zx_time_t deadline = delayed_work_time_.is_null()
- ? ZX_TIME_INFINITE
- : delayed_work_time_.ToZxTime();
- HandleEvents(deadline);
- }
-}
-
-void MessagePumpFuchsia::Quit() {
- keep_running_ = false;
-}
-
-void MessagePumpFuchsia::ScheduleWork() {
- // Stop AsyncDispatcher to let MessagePumpFuchsia::Run() handle message loop
- // tasks.
- async_dispatcher_.Stop();
-}
-
-void MessagePumpFuchsia::ScheduleDelayedWork(
- const TimeTicks& delayed_work_time) {
- // We know that we can't be blocked right now since this method can only be
- // called on the same thread as Run, so we only need to update our record of
- // how long to sleep when we do sleep.
- delayed_work_time_ = delayed_work_time;
-}
-
-} // namespace base
diff --git a/base/message_loop/message_pump_fuchsia.h b/base/message_loop/message_pump_fuchsia.h
deleted file mode 100644
index 514e23f..0000000
--- a/base/message_loop/message_pump_fuchsia.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2017 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 BASE_MESSAGE_LOOP_MESSAGE_PUMP_FUCHSIA_H_
-#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_FUCHSIA_H_
-
-#include <lib/async/wait.h>
-
-#include "base/base_export.h"
-#include "base/fuchsia/async_dispatcher.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_pump.h"
-#include "base/message_loop/watchable_io_message_pump_posix.h"
-
-typedef struct fdio fdio_t;
-
-namespace base {
-
-class BASE_EXPORT MessagePumpFuchsia : public MessagePump,
- public WatchableIOMessagePumpPosix {
- public:
- // Implemented by callers to receive notifications of handle & fd events.
- class ZxHandleWatcher {
- public:
- virtual void OnZxHandleSignalled(zx_handle_t handle,
- zx_signals_t signals) = 0;
-
- protected:
- virtual ~ZxHandleWatcher() {}
- };
-
- // Manages an active watch on an zx_handle_t.
- class ZxHandleWatchController : public async_wait_t {
- public:
- explicit ZxHandleWatchController(const Location& from_here);
- // Deleting the Controller implicitly calls StopWatchingZxHandle.
- virtual ~ZxHandleWatchController();
-
- // Stop watching the handle, always safe to call. No-op if there's nothing
- // to do.
- bool StopWatchingZxHandle();
-
- const Location& created_from_location() { return created_from_location_; }
-
- protected:
- friend class MessagePumpFuchsia;
-
- virtual bool WaitBegin();
-
- static void HandleSignal(async_t* async,
- async_wait_t* wait,
- zx_status_t status,
- const zx_packet_signal_t* signal);
-
- const Location created_from_location_;
-
- // This bool is used by the pump when invoking the ZxHandleWatcher callback,
- // and by the FdHandleWatchController when invoking read & write callbacks,
- // to cope with the possibility of the caller deleting the *Watcher within
- // the callback. The pump sets |was_stopped_| to a location on the stack,
- // and the Watcher writes to it, if set, when deleted, allowing the pump
- // to check the value on the stack to short-cut any post-callback work.
- bool* was_stopped_ = nullptr;
-
- // Set directly from the inputs to WatchFileDescriptor.
- ZxHandleWatcher* watcher_ = nullptr;
-
- // Used to safely access resources owned by the associated message pump.
- WeakPtr<MessagePumpFuchsia> weak_pump_;
-
- // A watch may be marked as persistent, which means it remains active even
- // after triggering.
- bool persistent_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(ZxHandleWatchController);
- };
-
- class FdWatchController : public FdWatchControllerInterface,
- public ZxHandleWatchController,
- public ZxHandleWatcher {
- public:
- explicit FdWatchController(const Location& from_here);
- ~FdWatchController() override;
-
- // FdWatchControllerInterface:
- bool StopWatchingFileDescriptor() override;
-
- private:
- friend class MessagePumpFuchsia;
-
- // Determines the desires signals, and begins waiting on the handle.
- bool WaitBegin() override;
-
- // ZxHandleWatcher interface.
- void OnZxHandleSignalled(zx_handle_t handle, zx_signals_t signals) override;
-
- // Set directly from the inputs to WatchFileDescriptor.
- FdWatcher* watcher_ = nullptr;
- int fd_ = -1;
- uint32_t desired_events_ = 0;
-
- // Set by WatchFileDescriptor to hold a reference to the descriptor's mxio.
- fdio_t* io_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(FdWatchController);
- };
-
- enum Mode {
- WATCH_READ = 1 << 0,
- WATCH_WRITE = 1 << 1,
- WATCH_READ_WRITE = WATCH_READ | WATCH_WRITE
- };
-
- MessagePumpFuchsia();
- ~MessagePumpFuchsia() override;
-
- bool WatchZxHandle(zx_handle_t handle,
- bool persistent,
- zx_signals_t signals,
- ZxHandleWatchController* controller,
- ZxHandleWatcher* delegate);
- bool WatchFileDescriptor(int fd,
- bool persistent,
- int mode,
- FdWatchController* controller,
- FdWatcher* delegate);
-
- // MessagePump implementation:
- void Run(Delegate* delegate) override;
- void Quit() override;
- void ScheduleWork() override;
- void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
-
- private:
- // Handles IO events by running |async_dispatcher_|. Returns true if any
- // events were received or if ScheduleWork() was called.
- bool HandleEvents(zx_time_t deadline);
-
- // This flag is set to false when Run should return.
- bool keep_running_ = true;
-
- AsyncDispatcher async_dispatcher_;
-
- // The time at which we should call DoDelayedWork.
- TimeTicks delayed_work_time_;
-
- base::WeakPtrFactory<MessagePumpFuchsia> weak_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpFuchsia);
-};
-
-} // namespace base
-
-#endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_FUCHSIA_H_
diff --git a/base/native_library_fuchsia.cc b/base/native_library_fuchsia.cc
deleted file mode 100644
index 1d74273..0000000
--- a/base/native_library_fuchsia.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// 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 "base/native_library.h"
-
-#include <fcntl.h>
-#include <fdio/io.h>
-#include <stdio.h>
-#include <zircon/dlfcn.h>
-#include <zircon/status.h>
-#include <zircon/syscalls.h>
-
-#include "base/base_paths_fuchsia.h"
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/fuchsia/scoped_zx_handle.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/posix/safe_strerror.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_restrictions.h"
-
-namespace base {
-
-std::string NativeLibraryLoadError::ToString() const {
- return message;
-}
-
-NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path,
- const NativeLibraryOptions& options,
- NativeLibraryLoadError* error) {
- std::vector<base::FilePath::StringType> components;
- library_path.GetComponents(&components);
- if (components.size() != 1u) {
- NOTREACHED() << "library_path is a path, should be a filename: "
- << library_path.MaybeAsASCII();
- return nullptr;
- }
-
- FilePath computed_path = base::GetPackageRoot();
- computed_path = computed_path.AppendASCII("lib").Append(components[0]);
- base::File library(computed_path,
- base::File::FLAG_OPEN | base::File::FLAG_READ);
- if (!library.IsValid()) {
- if (error) {
- error->message = base::StringPrintf(
- "open library: %s",
- base::File::ErrorToString(library.error_details()).c_str());
- }
- return nullptr;
- }
-
- base::ScopedZxHandle vmo;
- zx_status_t status =
- fdio_get_vmo_clone(library.GetPlatformFile(), vmo.receive());
- if (status != ZX_OK) {
- if (error) {
- error->message = base::StringPrintf("fdio_get_vmo_clone: %s",
- zx_status_get_string(status));
- }
- return nullptr;
- }
- NativeLibrary result = dlopen_vmo(vmo.get(), RTLD_LAZY | RTLD_LOCAL);
- return result;
-}
-
-void UnloadNativeLibrary(NativeLibrary library) {
- // dlclose() is a no-op on Fuchsia, so do nothing here.
-}
-
-void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
- StringPiece name) {
- return dlsym(library, name.data());
-}
-
-std::string GetNativeLibraryName(StringPiece name) {
- return base::StringPrintf("lib%s.so", name.as_string().c_str());
-}
-
-std::string GetLoadableModuleName(StringPiece name) {
- return GetNativeLibraryName(name);
-}
-
-} // namespace base
diff --git a/base/process/kill_fuchsia.cc b/base/process/kill_fuchsia.cc
deleted file mode 100644
index a862fc3..0000000
--- a/base/process/kill_fuchsia.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 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/process/kill.h"
-
-#include <zircon/syscalls.h>
-
-#include "base/process/process_iterator.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/threading/platform_thread.h"
-
-namespace base {
-
-bool KillProcessGroup(ProcessHandle process_group_id) {
- // |process_group_id| is really a job on Fuchsia.
- zx_status_t status = zx_task_kill(process_group_id);
- DLOG_IF(ERROR, status != ZX_OK)
- << "unable to terminate job " << process_group_id;
- return status == ZX_OK;
-}
-
-TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
- DCHECK(exit_code);
-
- zx_info_process_t process_info;
- zx_status_t status =
- zx_object_get_info(handle, ZX_INFO_PROCESS, &process_info,
- sizeof(process_info), nullptr, nullptr);
- if (status != ZX_OK) {
- DLOG(ERROR) << "unable to get termination status for " << handle;
- *exit_code = 0;
- return TERMINATION_STATUS_NORMAL_TERMINATION;
- }
- if (!process_info.started) {
- *exit_code = 0;
- return TERMINATION_STATUS_LAUNCH_FAILED;
- }
- if (!process_info.exited) {
- *exit_code = 0;
- return TERMINATION_STATUS_STILL_RUNNING;
- }
-
- // TODO(fuchsia): Is there more information about types of crashes, OOM, etc.
- // available? https://crbug.com/706592.
-
- *exit_code = process_info.return_code;
- return process_info.return_code == 0
- ? TERMINATION_STATUS_NORMAL_TERMINATION
- : TERMINATION_STATUS_ABNORMAL_TERMINATION;
-}
-
-} // namespace base
diff --git a/base/process/launch_fuchsia.cc b/base/process/launch_fuchsia.cc
deleted file mode 100644
index 3bc7580..0000000
--- a/base/process/launch_fuchsia.cc
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2017 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/process/launch.h"
-
-#include <fdio/limits.h>
-#include <fdio/namespace.h>
-#include <fdio/util.h>
-#include <launchpad/launchpad.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <zircon/process.h>
-#include <zircon/processargs.h>
-
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/fuchsia/default_job.h"
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/scoped_generic.h"
-
-namespace base {
-
-namespace {
-
-bool GetAppOutputInternal(const CommandLine& cmd_line,
- bool include_stderr,
- std::string* output,
- int* exit_code) {
- DCHECK(exit_code);
-
- LaunchOptions options;
-
- // LaunchProcess will automatically clone any stdio fd we do not explicitly
- // map.
- int pipe_fd[2];
- if (pipe(pipe_fd) < 0)
- return false;
- options.fds_to_remap.emplace_back(pipe_fd[1], STDOUT_FILENO);
- if (include_stderr)
- options.fds_to_remap.emplace_back(pipe_fd[1], STDERR_FILENO);
-
- Process process = LaunchProcess(cmd_line, options);
- close(pipe_fd[1]);
- if (!process.IsValid()) {
- close(pipe_fd[0]);
- return false;
- }
-
- output->clear();
- for (;;) {
- char buffer[256];
- ssize_t bytes_read = read(pipe_fd[0], buffer, sizeof(buffer));
- if (bytes_read <= 0)
- break;
- output->append(buffer, bytes_read);
- }
- close(pipe_fd[0]);
-
- return process.WaitForExit(exit_code);
-}
-
-bool MapPathsToLaunchpad(const std::vector<FilePath>& paths_to_map,
- launchpad_t* lp) {
- zx_status_t status;
-
- // Build a array of null terminated strings, which which will be used as an
- // argument for launchpad_set_nametable().
- std::vector<const char*> paths_c_str;
- paths_c_str.reserve(paths_to_map.size());
-
- for (size_t paths_idx = 0; paths_idx < paths_to_map.size(); ++paths_idx) {
- const FilePath& next_path = paths_to_map[paths_idx];
- if (!PathExists(next_path)) {
- DLOG(ERROR) << "Path does not exist: " << next_path;
- return false;
- }
-
- File dir(next_path, File::FLAG_OPEN | File::FLAG_READ);
- ScopedPlatformFile scoped_fd(dir.TakePlatformFile());
- zx_handle_t handles[FDIO_MAX_HANDLES] = {};
- uint32_t types[FDIO_MAX_HANDLES] = {};
- zx_status_t num_handles =
- fdio_transfer_fd(scoped_fd.get(), 0, handles, types);
- // fdio_transfer_fd() returns number of transferred handles, or negative
- // error.
- if (num_handles <= 0) {
- DCHECK_LT(num_handles, 0);
- ZX_LOG(ERROR, num_handles) << "fdio_transfer_fd";
- return false;
- }
- ScopedZxHandle scoped_handle(handles[0]);
- ignore_result(scoped_fd.release());
-
- // Close the handles that we won't use.
- for (int i = 1; i < num_handles; ++i) {
- zx_handle_close(handles[i]);
- }
-
- if (types[0] != PA_FDIO_REMOTE) {
- LOG(ERROR) << "Handle type for " << next_path.AsUTF8Unsafe()
- << " is not PA_FDIO_REMOTE: " << types[0];
- return false;
- }
-
- // Add the handle to the child's nametable.
- // We use the macro PA_HND(..., <index>) to relate the handle to its
- // position in the nametable, which is stored as an array of path strings
- // |paths_str|.
- status = launchpad_add_handle(lp, scoped_handle.release(),
- PA_HND(PA_NS_DIR, paths_idx));
- if (status != ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_add_handle";
- return false;
- }
- paths_c_str.push_back(next_path.value().c_str());
- }
-
- if (!paths_c_str.empty()) {
- status =
- launchpad_set_nametable(lp, paths_c_str.size(), paths_c_str.data());
- if (status != ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_set_nametable";
- return false;
- }
- }
-
- return true;
-}
-
-struct LaunchpadScopedTraits {
- static launchpad_t* InvalidValue() { return nullptr; }
-
- static void Free(launchpad_t* lp) { launchpad_destroy(lp); }
-};
-
-using ScopedLaunchpad = ScopedGeneric<launchpad_t*, LaunchpadScopedTraits>;
-
-} // namespace
-
-Process LaunchProcess(const CommandLine& cmdline,
- const LaunchOptions& options) {
- return LaunchProcess(cmdline.argv(), options);
-}
-
-// TODO(768416): Investigate whether we can make LaunchProcess() create
-// unprivileged processes by default (no implicit capabilities are granted).
-Process LaunchProcess(const std::vector<std::string>& argv,
- const LaunchOptions& options) {
- std::vector<const char*> argv_cstr;
- argv_cstr.reserve(argv.size() + 1);
- for (const auto& arg : argv)
- argv_cstr.push_back(arg.c_str());
- argv_cstr.push_back(nullptr);
-
- // Note that per launchpad.h, the intention is that launchpad_ functions are
- // used in a "builder" style. From launchpad_create() to launchpad_go() the
- // status is tracked in the launchpad_t object, and launchpad_go() reports on
- // the final status, and cleans up |lp| (assuming it was even created).
- zx_handle_t job = options.job_handle != ZX_HANDLE_INVALID ? options.job_handle
- : GetDefaultJob();
- DCHECK_NE(ZX_HANDLE_INVALID, job);
- ScopedLaunchpad lp;
- zx_status_t status;
- if ((status = launchpad_create(job, argv_cstr[0], lp.receive())) != ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_create(job)";
- return Process();
- }
-
- if ((status = launchpad_load_from_file(lp.get(), argv_cstr[0])) != ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_load_from_file(" << argv_cstr[0] << ")";
- return Process();
- }
-
- if ((status = launchpad_set_args(lp.get(), argv.size(), argv_cstr.data())) !=
- ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_set_args";
- return Process();
- }
-
- uint32_t to_clone = options.clone_flags;
-
- std::unique_ptr<char* []> new_environ;
- char* const empty_environ = nullptr;
- char* const* old_environ = environ;
- if (options.clear_environ)
- old_environ = &empty_environ;
-
- EnvironmentMap environ_modifications = options.environ;
- if (!options.current_directory.empty()) {
- environ_modifications["PWD"] = options.current_directory.value();
- } else {
- FilePath cwd;
- GetCurrentDirectory(&cwd);
- environ_modifications["PWD"] = cwd.value();
- }
-
- if (to_clone & LP_CLONE_DEFAULT_JOB) {
- // Override Fuchsia's built in default job cloning behavior with our own
- // logic which uses |job| instead of zx_job_default().
- // This logic is based on the launchpad implementation.
- zx_handle_t job_duplicate = ZX_HANDLE_INVALID;
- if ((status = zx_handle_duplicate(job, ZX_RIGHT_SAME_RIGHTS,
- &job_duplicate)) != ZX_OK) {
- ZX_LOG(ERROR, status) << "zx_handle_duplicate";
- return Process();
- }
- launchpad_add_handle(lp.get(), job_duplicate, PA_HND(PA_JOB_DEFAULT, 0));
- to_clone &= ~LP_CLONE_DEFAULT_JOB;
- }
-
- if (!environ_modifications.empty())
- new_environ = AlterEnvironment(old_environ, environ_modifications);
-
- if (!environ_modifications.empty() || options.clear_environ)
- launchpad_set_environ(lp.get(), new_environ.get());
- else
- to_clone |= LP_CLONE_ENVIRON;
-
- if (!options.paths_to_map.empty()) {
- DCHECK(!(to_clone & LP_CLONE_FDIO_NAMESPACE));
- if (!MapPathsToLaunchpad(options.paths_to_map, lp.get())) {
- return Process();
- }
- }
-
- launchpad_clone(lp.get(), to_clone);
-
- // Clone the mapped file-descriptors, plus any of the stdio descriptors
- // which were not explicitly specified.
- bool stdio_already_mapped[3] = {false};
- for (const auto& src_target : options.fds_to_remap) {
- if (static_cast<size_t>(src_target.second) <
- arraysize(stdio_already_mapped)) {
- stdio_already_mapped[src_target.second] = true;
- }
- launchpad_clone_fd(lp.get(), src_target.first, src_target.second);
- }
- if (to_clone & LP_CLONE_FDIO_STDIO) {
- for (size_t stdio_fd = 0; stdio_fd < arraysize(stdio_already_mapped);
- ++stdio_fd) {
- if (!stdio_already_mapped[stdio_fd])
- launchpad_clone_fd(lp.get(), stdio_fd, stdio_fd);
- }
- to_clone &= ~LP_CLONE_FDIO_STDIO;
- }
-
- for (const auto& id_and_handle : options.handles_to_transfer) {
- launchpad_add_handle(lp.get(), id_and_handle.handle, id_and_handle.id);
- }
-
- zx_handle_t process_handle;
- const char* errmsg;
- if ((status = launchpad_go(lp.get(), &process_handle, &errmsg)) != ZX_OK) {
- ZX_LOG(ERROR, status) << "launchpad_go failed: " << errmsg;
- return Process();
- }
- ignore_result(lp.release()); // launchpad_go() took ownership.
-
- Process process(process_handle);
- if (options.wait) {
- status = zx_object_wait_one(process.Handle(), ZX_TASK_TERMINATED,
- ZX_TIME_INFINITE, nullptr);
- DCHECK(status == ZX_OK)
- << "zx_object_wait_one: " << zx_status_get_string(status);
- }
-
- return process;
-}
-
-bool GetAppOutput(const CommandLine& cl, std::string* output) {
- int exit_code;
- bool result = GetAppOutputInternal(cl, false, output, &exit_code);
- return result && exit_code == EXIT_SUCCESS;
-}
-
-bool GetAppOutput(const std::vector<std::string>& argv, std::string* output) {
- return GetAppOutput(CommandLine(argv), output);
-}
-
-bool GetAppOutputAndError(const CommandLine& cl, std::string* output) {
- int exit_code;
- bool result = GetAppOutputInternal(cl, true, output, &exit_code);
- return result && exit_code == EXIT_SUCCESS;
-}
-
-bool GetAppOutputAndError(const std::vector<std::string>& argv,
- std::string* output) {
- return GetAppOutputAndError(CommandLine(argv), output);
-}
-
-bool GetAppOutputWithExitCode(const CommandLine& cl,
- std::string* output,
- int* exit_code) {
- // Contrary to GetAppOutput(), |true| return here means that the process was
- // launched and the exit code was waited upon successfully, but not
- // necessarily that the exit code was EXIT_SUCCESS.
- return GetAppOutputInternal(cl, false, output, exit_code);
-}
-
-void RaiseProcessToHighPriority() {
- // Fuchsia doesn't provide an API to change process priority.
-}
-
-} // namespace base
diff --git a/base/process/memory_fuchsia.cc b/base/process/memory_fuchsia.cc
deleted file mode 100644
index 6f559a4..0000000
--- a/base/process/memory_fuchsia.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 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/process/memory.h"
-
-#include <stdlib.h>
-
-namespace base {
-
-void EnableTerminationOnOutOfMemory() {
- // Nothing to be done here.
-}
-
-void EnableTerminationOnHeapCorruption() {
- // Nothing to be done here.
-}
-
-bool UncheckedMalloc(size_t size, void** result) {
- *result = malloc(size);
- return *result != nullptr;
-}
-
-} // namespace base
diff --git a/base/process/process_fuchsia.cc b/base/process/process_fuchsia.cc
deleted file mode 100644
index 94bce34..0000000
--- a/base/process/process_fuchsia.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2017 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/process/process.h"
-
-#include <zircon/process.h>
-#include <zircon/syscalls.h>
-
-#include "base/debug/activity_tracker.h"
-#include "base/fuchsia/default_job.h"
-#include "base/strings/stringprintf.h"
-
-namespace base {
-
-Process::Process(ProcessHandle handle)
- : process_(handle), is_current_process_(false) {
- CHECK_NE(handle, zx_process_self());
-}
-
-Process::~Process() {
- Close();
-}
-
-Process::Process(Process&& other)
- : process_(std::move(other.process_)),
- is_current_process_(other.is_current_process_) {
- other.is_current_process_ = false;
-}
-
-Process& Process::operator=(Process&& other) {
- process_ = std::move(other.process_);
- is_current_process_ = other.is_current_process_;
- other.is_current_process_ = false;
- return *this;
-}
-
-// static
-Process Process::Current() {
- Process process;
- process.is_current_process_ = true;
- return process;
-}
-
-// static
-Process Process::Open(ProcessId pid) {
- if (pid == GetCurrentProcId())
- return Current();
-
- // While a process with object id |pid| might exist, the job returned by
- // zx_job_default() might not contain it, so this call can fail.
- ScopedZxHandle handle;
- zx_status_t status = zx_object_get_child(
- GetDefaultJob(), pid, ZX_RIGHT_SAME_RIGHTS, handle.receive());
- if (status != ZX_OK) {
- DLOG(ERROR) << "zx_object_get_child failed: " << status;
- return Process();
- }
- return Process(handle.release());
-}
-
-// static
-Process Process::OpenWithExtraPrivileges(ProcessId pid) {
- // No privileges to set.
- return Open(pid);
-}
-
-// static
-Process Process::DeprecatedGetProcessFromHandle(ProcessHandle handle) {
- DCHECK_NE(handle, GetCurrentProcessHandle());
- ScopedZxHandle out;
- if (zx_handle_duplicate(handle, ZX_RIGHT_SAME_RIGHTS, out.receive()) !=
- ZX_OK) {
- DLOG(ERROR) << "zx_handle_duplicate failed: " << handle;
- return Process();
- }
-
- return Process(out.release());
-}
-
-// static
-bool Process::CanBackgroundProcesses() {
- return false;
-}
-
-// static
-void Process::TerminateCurrentProcessImmediately(int exit_code) {
- _exit(exit_code);
-}
-
-bool Process::IsValid() const {
- return process_.is_valid() || is_current();
-}
-
-ProcessHandle Process::Handle() const {
- return is_current_process_ ? zx_process_self() : process_.get();
-}
-
-Process Process::Duplicate() const {
- if (is_current())
- return Current();
-
- if (!IsValid())
- return Process();
-
- ScopedZxHandle out;
- if (zx_handle_duplicate(process_.get(), ZX_RIGHT_SAME_RIGHTS,
- out.receive()) != ZX_OK) {
- DLOG(ERROR) << "zx_handle_duplicate failed: " << process_.get();
- return Process();
- }
-
- return Process(out.release());
-}
-
-ProcessId Process::Pid() const {
- DCHECK(IsValid());
- return GetProcId(Handle());
-}
-
-bool Process::is_current() const {
- return is_current_process_;
-}
-
-void Process::Close() {
- is_current_process_ = false;
- process_.reset();
-}
-
-bool Process::Terminate(int exit_code, bool wait) const {
- // exit_code isn't supportable. https://crbug.com/753490.
- zx_status_t status = zx_task_kill(Handle());
- // TODO(scottmg): Put these LOG/CHECK back to DLOG/DCHECK after
- // https://crbug.com/750756 is diagnosed.
- if (status == ZX_OK && wait) {
- zx_signals_t signals;
- status = zx_object_wait_one(Handle(), ZX_TASK_TERMINATED,
- zx_deadline_after(ZX_SEC(60)), &signals);
- if (status != ZX_OK) {
- LOG(ERROR) << "Error waiting for process exit: " << status;
- } else {
- CHECK(signals & ZX_TASK_TERMINATED);
- }
- } else if (status != ZX_OK) {
- LOG(ERROR) << "Unable to terminate process: " << status;
- }
-
- return status >= 0;
-}
-
-bool Process::WaitForExit(int* exit_code) const {
- return WaitForExitWithTimeout(TimeDelta::Max(), exit_code);
-}
-
-bool Process::WaitForExitWithTimeout(TimeDelta timeout, int* exit_code) const {
- if (is_current_process_)
- return false;
-
- // Record the event that this thread is blocking upon (for hang diagnosis).
- base::debug::ScopedProcessWaitActivity process_activity(this);
-
- zx_time_t deadline = timeout == TimeDelta::Max()
- ? ZX_TIME_INFINITE
- : (TimeTicks::Now() + timeout).ToZxTime();
- // TODO(scottmg): https://crbug.com/755282
- const bool kOnBot = getenv("CHROME_HEADLESS") != nullptr;
- if (kOnBot) {
- LOG(ERROR) << base::StringPrintf(
- "going to wait for process %x (deadline=%zu, now=%zu)", process_.get(),
- deadline, TimeTicks::Now().ToZxTime());
- }
- zx_signals_t signals_observed = 0;
- zx_status_t status = zx_object_wait_one(process_.get(), ZX_TASK_TERMINATED,
- deadline, &signals_observed);
-
- // TODO(scottmg): Make these LOGs into DLOGs after https://crbug.com/750756 is
- // fixed.
- if (status != ZX_OK && status != ZX_ERR_TIMED_OUT) {
- LOG(ERROR) << "zx_object_wait_one failed, status=" << status;
- return false;
- }
- if (status == ZX_ERR_TIMED_OUT) {
- zx_time_t now = TimeTicks::Now().ToZxTime();
- LOG(ERROR) << "zx_object_wait_one timed out, signals=" << signals_observed
- << ", deadline=" << deadline << ", now=" << now
- << ", delta=" << (now - deadline);
- return false;
- }
-
- zx_info_process_t proc_info;
- status = zx_object_get_info(process_.get(), ZX_INFO_PROCESS, &proc_info,
- sizeof(proc_info), nullptr, nullptr);
- if (status != ZX_OK) {
- LOG(ERROR) << "zx_object_get_info failed, status=" << status;
- if (exit_code)
- *exit_code = -1;
- return false;
- }
-
- if (exit_code)
- *exit_code = proc_info.return_code;
-
- return true;
-}
-
-void Process::Exited(int exit_code) const {}
-
-bool Process::IsProcessBackgrounded() const {
- // See SetProcessBackgrounded().
- DCHECK(IsValid());
- return false;
-}
-
-bool Process::SetProcessBackgrounded(bool value) {
- // No process priorities on Fuchsia. TODO(fuchsia): See MG-783, and update
- // this later if priorities are implemented.
- return false;
-}
-
-int Process::GetPriority() const {
- DCHECK(IsValid());
- // No process priorities on Fuchsia.
- return 0;
-}
-
-} // namespace base
diff --git a/base/process/process_handle_fuchsia.cc b/base/process/process_handle_fuchsia.cc
deleted file mode 100644
index c9d2a8e..0000000
--- a/base/process/process_handle_fuchsia.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 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/process/process_handle.h"
-
-#include <zircon/process.h>
-#include <zircon/status.h>
-#include <zircon/syscalls.h>
-
-#include "base/logging.h"
-
-namespace base {
-
-ProcessId GetCurrentProcId() {
- return GetProcId(GetCurrentProcessHandle());
-}
-
-ProcessHandle GetCurrentProcessHandle() {
- // Note that zx_process_self() returns a real handle, and ownership is not
- // transferred to the caller (i.e. this should never be closed).
- return zx_process_self();
-}
-
-ProcessId GetProcId(ProcessHandle process) {
- zx_info_handle_basic_t basic;
- zx_status_t status = zx_object_get_info(process, ZX_INFO_HANDLE_BASIC, &basic,
- sizeof(basic), nullptr, nullptr);
- if (status != ZX_OK) {
- DLOG(ERROR) << "zx_object_get_info failed: "
- << zx_status_get_string(status);
- return ZX_KOID_INVALID;
- }
- return basic.koid;
-}
-
-} // namespace base
diff --git a/base/process/process_iterator_fuchsia.cc b/base/process/process_iterator_fuchsia.cc
deleted file mode 100644
index 6d411ba..0000000
--- a/base/process/process_iterator_fuchsia.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 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/process/process_iterator.h"
-
-namespace base {
-
-ProcessIterator::ProcessIterator(const ProcessFilter* filter) {
- // TODO(fuchsia): There's no Fuchsia API to iterate processes currently.
- NOTREACHED();
-}
-
-ProcessIterator::~ProcessIterator() {}
-
-bool ProcessIterator::CheckForNextProcess() {
- // TODO(fuchsia): There's no Fuchsia API to iterate processes currently.
- return false;
-}
-
-bool NamedProcessIterator::IncludeEntry() {
- // TODO(fuchsia): There's no Fuchsia API to iterate processes currently.
- return false;
-}
-
-} // namespace base
diff --git a/base/process/process_metrics_fuchsia.cc b/base/process/process_metrics_fuchsia.cc
deleted file mode 100644
index a34dff7..0000000
--- a/base/process/process_metrics_fuchsia.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 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/process/process_metrics.h"
-
-#include <fdio/limits.h>
-
-namespace base {
-
-size_t GetMaxFds() {
- return FDIO_MAX_FD;
-}
-
-size_t GetSystemCommitCharge() {
- // Not available, doesn't seem likely that it will be (for the whole system).
- NOTIMPLEMENTED();
- return 0;
-}
-
-// static
-std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics(
- ProcessHandle process) {
- NOTIMPLEMENTED(); // TODO(fuchsia): https://crbug.com/706592.
- return nullptr;
-}
-
-TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
- NOTIMPLEMENTED(); // TODO(fuchsia): https://crbug.com/706592.
- return TimeDelta();
-}
-
-bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) {
- NOTIMPLEMENTED(); // TODO(fuchsia): https://crbug.com/706592.
- return false;
-}
-
-} // namespace base
diff --git a/base/rand_util_fuchsia.cc b/base/rand_util_fuchsia.cc
deleted file mode 100644
index 5f991d5..0000000
--- a/base/rand_util_fuchsia.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 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/rand_util.h"
-
-#include <zircon/syscalls.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-
-namespace base {
-
-void RandBytes(void* output, size_t output_length) {
- size_t remaining = output_length;
- unsigned char* cur = reinterpret_cast<unsigned char*>(output);
- while (remaining > 0) {
- // The syscall has a maximum number of bytes that can be read at once.
- size_t read_len =
- std::min(remaining, static_cast<size_t>(ZX_CPRNG_DRAW_MAX_LEN));
-
- size_t actual;
- zx_status_t status = zx_cprng_draw(cur, read_len, &actual);
- CHECK(status == ZX_OK && read_len == actual);
-
- CHECK(remaining >= actual);
- remaining -= actual;
- cur += actual;
- }
-}
-
-} // namespace base
diff --git a/base/sys_info_fuchsia.cc b/base/sys_info_fuchsia.cc
deleted file mode 100644
index 081a55d..0000000
--- a/base/sys_info_fuchsia.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 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/sys_info.h"
-
-#include <zircon/syscalls.h>
-
-#include "base/logging.h"
-
-namespace base {
-
-// static
-int64_t SysInfo::AmountOfPhysicalMemoryImpl() {
- return zx_system_get_physmem();
-}
-
-// static
-int64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() {
- // TODO(fuchsia): https://crbug.com/706592 This is not exposed.
- NOTREACHED();
- return 0;
-}
-
-// static
-int SysInfo::NumberOfProcessors() {
- return zx_system_get_num_cpus();
-}
-
-// static
-int64_t SysInfo::AmountOfVirtualMemory() {
- return 0;
-}
-
-} // namespace base
diff --git a/base/threading/platform_thread_fuchsia.cc b/base/threading/platform_thread_fuchsia.cc
deleted file mode 100644
index eb06795..0000000
--- a/base/threading/platform_thread_fuchsia.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 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/threading/platform_thread.h"
-
-#include <pthread.h>
-#include <sched.h>
-#include <zircon/syscalls.h>
-
-#include "base/threading/platform_thread_internal_posix.h"
-#include "base/threading/thread_id_name_manager.h"
-
-namespace base {
-
-void InitThreading() {}
-
-void TerminateOnThread() {}
-
-size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) {
- return 0;
-}
-
-// static
-void PlatformThread::SetName(const std::string& name) {
- zx_status_t status = zx_object_set_property(CurrentId(), ZX_PROP_NAME,
- name.data(), name.size());
- DCHECK_EQ(status, ZX_OK);
-
- ThreadIdNameManager::GetInstance()->SetName(name);
-}
-
-// static
-bool PlatformThread::CanIncreaseCurrentThreadPriority() {
- return false;
-}
-
-// static
-void PlatformThread::SetCurrentThreadPriority(ThreadPriority priority) {
- if (priority != ThreadPriority::NORMAL) {
- NOTIMPLEMENTED() << "setting ThreadPriority " << static_cast<int>(priority);
- }
-}
-
-// static
-ThreadPriority PlatformThread::GetCurrentThreadPriority() {
- return ThreadPriority::NORMAL;
-}
-
-} // namespace base
diff --git a/base/time/time_fuchsia.cc b/base/time/time_fuchsia.cc
deleted file mode 100644
index 8b658b4..0000000
--- a/base/time/time_fuchsia.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 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/time/time.h"
-
-#include <zircon/syscalls.h>
-
-#include "base/compiler_specific.h"
-#include "base/numerics/checked_math.h"
-#include "base/time/time_override.h"
-
-namespace base {
-
-namespace {
-
-// Helper function to map an unsigned integer with nanosecond timebase to a
-// signed integer with microsecond timebase.
-ALWAYS_INLINE int64_t ZxTimeToMicroseconds(zx_time_t nanos) {
- const zx_time_t micros =
- nanos / static_cast<zx_time_t>(base::Time::kNanosecondsPerMicrosecond);
- return static_cast<int64_t>(micros);
-}
-
-} // namespace
-
-// Time -----------------------------------------------------------------------
-
-namespace subtle {
-Time TimeNowIgnoringOverride() {
- const zx_time_t nanos_since_unix_epoch = zx_clock_get(ZX_CLOCK_UTC);
- CHECK(nanos_since_unix_epoch != 0);
- // The following expression will overflow in the year 289938 A.D.:
- return Time() + TimeDelta::FromMicroseconds(
- ZxTimeToMicroseconds(nanos_since_unix_epoch) +
- Time::kTimeTToMicrosecondsOffset);
-}
-
-Time TimeNowFromSystemTimeIgnoringOverride() {
- // Just use TimeNowIgnoringOverride() because it returns the system time.
- return TimeNowIgnoringOverride();
-}
-} // namespace subtle
-
-// TimeTicks ------------------------------------------------------------------
-
-namespace subtle {
-TimeTicks TimeTicksNowIgnoringOverride() {
- const zx_time_t nanos_since_boot = zx_clock_get(ZX_CLOCK_MONOTONIC);
- CHECK(nanos_since_boot != 0);
- return TimeTicks() +
- TimeDelta::FromMicroseconds(ZxTimeToMicroseconds(nanos_since_boot));
-}
-} // namespace subtle
-
-// static
-TimeTicks::Clock TimeTicks::GetClock() {
- return Clock::FUCHSIA_ZX_CLOCK_MONOTONIC;
-}
-
-// static
-bool TimeTicks::IsHighResolution() {
- return true;
-}
-
-// static
-bool TimeTicks::IsConsistentAcrossProcesses() {
- return true;
-}
-
-// static
-TimeTicks TimeTicks::FromZxTime(zx_time_t nanos_since_boot) {
- return TimeTicks(ZxTimeToMicroseconds(nanos_since_boot));
-}
-
-zx_time_t TimeTicks::ToZxTime() const {
- CheckedNumeric<zx_time_t> result(base::Time::kNanosecondsPerMicrosecond);
- result *= us_;
- return result.ValueOrDie();
-}
-
-// ThreadTicks ----------------------------------------------------------------
-
-namespace subtle {
-ThreadTicks ThreadTicksNowIgnoringOverride() {
- const zx_time_t nanos_since_thread_started = zx_clock_get(ZX_CLOCK_THREAD);
- CHECK(nanos_since_thread_started != 0);
- return ThreadTicks() + TimeDelta::FromMicroseconds(
- ZxTimeToMicroseconds(nanos_since_thread_started));
-}
-} // namespace subtle
-
-} // namespace base