// 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_
