blob: 4a2dfd91d42f2d57534b5720c0a8597fa6af99c5 [file] [log] [blame]
// 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 <lib/syslog/cpp/macros.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