blob: 666c30441b9dbad23a42ba4657ae0e82cb21e143 [file] [log] [blame]
// Copyright 2016 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.
#ifndef GARNET_BIN_TRACE_MANAGER_TRACEE_H_
#define GARNET_BIN_TRACE_MANAGER_TRACEE_H_
#include <lib/async/cpp/wait.h>
#include <lib/zx/socket.h>
#include <lib/zx/vmo.h>
#include <functional>
#include <iosfwd>
#include "garnet/bin/trace_manager/trace_provider_bundle.h"
#include "lib/fidl/cpp/string.h"
#include "lib/fidl/cpp/vector.h"
#include "lib/fxl/functional/closure.h"
#include "lib/fxl/macros.h"
#include "lib/fxl/memory/weak_ptr.h"
namespace tracing {
class Tracee {
public:
enum class State {
// All systems go, provider hasn't been started, yet.
kReady,
// The provider was asked to start.
kStartPending,
// The provider is started and tracing.
kStarted,
// The provider is being stopped right now.
kStopping,
// The provider is stopped.
kStopped
};
enum class TransferStatus {
// The transfer is complete.
kComplete,
// The transfer is incomplete and subsequent
// transfers should not be executed as the underlying
// stream has been corrupted.
kCorrupted,
// The receiver of the transfer went away.
kReceiverDead,
};
explicit Tracee(TraceProviderBundle* bundle);
~Tracee();
bool operator==(TraceProviderBundle* bundle) const;
bool Start(size_t buffer_size,
fidl::VectorPtr<fidl::StringPtr> categories,
fxl::Closure started_callback,
fxl::Closure stopped_callback);
void Stop();
TransferStatus TransferRecords(const zx::socket& socket) const;
TraceProviderBundle* bundle() const { return bundle_; }
State state() const { return state_; }
private:
void TransitionToState(State new_state);
void OnHandleReady(async_t* async,
async::WaitBase* wait,
zx_status_t status,
const zx_packet_signal_t* signal);
void OnHandleError(zx_status_t status);
TransferStatus WriteProviderInfoRecord(const zx::socket& socket) const;
TransferStatus WriteProviderBufferOverflowEvent(
const zx::socket& socket) const;
TraceProviderBundle* bundle_;
State state_ = State::kReady;
zx::vmo buffer_vmo_;
size_t buffer_vmo_size_ = 0u;
zx::eventpair fence_;
fxl::Closure started_callback_;
fxl::Closure stopped_callback_;
async_t* async_ = nullptr;
async::WaitMethod<Tracee, &Tracee::OnHandleReady> wait_;
bool buffer_overflow_ = false;
fxl::WeakPtrFactory<Tracee> weak_ptr_factory_;
FXL_DISALLOW_COPY_AND_ASSIGN(Tracee);
};
std::ostream& operator<<(std::ostream& out, Tracee::State state);
} // namespace tracing
#endif // GARNET_BIN_TRACE_MANAGER_TRACEE_H_