| // Copyright 2019 The Fuchsia 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 "garnet/bin/trace_manager/util.h" |
| |
| #include "src/lib/fxl/logging.h" |
| |
| namespace tracing { |
| |
| TransferStatus WriteBufferToSocket(const zx::socket& socket, const void* buffer, size_t len) { |
| auto data = reinterpret_cast<const uint8_t*>(buffer); |
| size_t offset = 0; |
| while (offset < len) { |
| zx_status_t status = ZX_OK; |
| size_t actual = 0; |
| if ((status = socket.write(0u, data + offset, len - offset, &actual)) < 0) { |
| if (status == ZX_ERR_SHOULD_WAIT) { |
| zx_signals_t pending = 0; |
| status = socket.wait_one(ZX_SOCKET_WRITABLE | ZX_SOCKET_PEER_CLOSED, zx::time::infinite(), |
| &pending); |
| if (status < 0) { |
| FX_LOGS(ERROR) << "Wait on socket failed: " << status; |
| return TransferStatus::kWriteError; |
| } |
| |
| if (pending & ZX_SOCKET_WRITABLE) |
| continue; |
| |
| if (pending & ZX_SOCKET_PEER_CLOSED) { |
| FX_LOGS(ERROR) << "Peer closed while writing to socket"; |
| return TransferStatus::kReceiverDead; |
| } |
| } |
| |
| return TransferStatus::kWriteError; |
| } |
| offset += actual; |
| } |
| |
| return TransferStatus::kComplete; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, TransferStatus status) { |
| switch (status) { |
| case TransferStatus::kComplete: |
| out << "complete"; |
| break; |
| case TransferStatus::kProviderError: |
| out << "provider error"; |
| break; |
| case TransferStatus::kWriteError: |
| out << "write error"; |
| break; |
| case TransferStatus::kReceiverDead: |
| out << "receiver dead"; |
| break; |
| } |
| |
| return out; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, controller::BufferDisposition disposition) { |
| switch (disposition) { |
| case controller::BufferDisposition::CLEAR_ALL: |
| out << "clear-all"; |
| break; |
| case controller::BufferDisposition::CLEAR_NONDURABLE: |
| out << "clear-nondurable"; |
| break; |
| case controller::BufferDisposition::RETAIN: |
| out << "retain"; |
| break; |
| } |
| |
| return out; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, controller::SessionState state) { |
| switch (state) { |
| case controller::SessionState::READY: |
| out << "ready"; |
| break; |
| case controller::SessionState::INITIALIZED: |
| out << "initialized"; |
| break; |
| case controller::SessionState::STARTING: |
| out << "starting"; |
| break; |
| case controller::SessionState::STARTED: |
| out << "started"; |
| break; |
| case controller::SessionState::STOPPING: |
| out << "stopping"; |
| break; |
| case controller::SessionState::STOPPED: |
| out << "stopped"; |
| break; |
| case controller::SessionState::TERMINATING: |
| out << "terminaing"; |
| break; |
| } |
| |
| return out; |
| } |
| |
| } // namespace tracing |