blob: 0fd6604eea6aebe19a4208b37bdf8eddbc76cc39 [file] [log] [blame]
// Copyright 2017 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.
//
// Trace observers allow components to observe when tracing is starting or
// stopping so they can prepare themselves to capture data accordingly.
//
// See <trace-engine/instrumentation.h> for the C API and more detailed
// documentation.
//
#ifndef ZIRCON_SYSTEM_ULIB_LIB_TRACE_OBSERVER_H_
#define ZIRCON_SYSTEM_ULIB_LIB_TRACE_OBSERVER_H_
#include <lib/trace-engine/instrumentation.h>
#ifdef __cplusplus
#include <lib/async/cpp/wait.h>
#include <lib/fit/function.h>
#include <lib/zx/event.h>
namespace trace {
// Receives notifications when the trace state or set of enabled categories changes.
class TraceObserver {
public:
// Initializes the trace observer.
TraceObserver();
// Stops watching for state changes and destroys the observer.
~TraceObserver();
// Starts watching for state changes.
//
// |async| the asynchronous dispatcher, must not be null.
// |callback| the callback which is invoked whenever a state change is observed.
void Start(async_dispatcher_t* dispatcher, fit::closure callback);
// Stops watching for state changes.
void Stop();
private:
void Handle(async_dispatcher_t* dispatcher, async::WaitBase* wait, zx_status_t status,
const zx_packet_signal_t* signal);
void BeginWait(async_dispatcher_t* dispatcher);
fit::closure callback_;
zx::event event_;
async::WaitMethod<TraceObserver, &TraceObserver::Handle> wait_{this};
};
} // namespace trace
#endif // __cplusplus
#endif // ZIRCON_SYSTEM_ULIB_LIB_TRACE_OBSERVER_H_