Add support for blocking method in StartupTracing

Introduced `SetupStartupTracingBlocking` method. It returns only when
relevant data sources are started.

This ensures that calls into DataSource::Trace() or trace macros right
after SetupStartupTracingBlocking are written into the startup session.

Change-Id: I703d4bd1f94ab99c381b32ea476756b815671eec
diff --git a/examples/sdk/example_startup_trace.cc b/examples/sdk/example_startup_trace.cc
index 3a3afe3..a8af67b 100644
--- a/examples/sdk/example_startup_trace.cc
+++ b/examples/sdk/example_startup_trace.cc
@@ -40,45 +40,11 @@
 
 namespace {
 
-class EventObserver {
- public:
-  // Wait until OnEvent is ever called.
-  // Returns immediately if OnEvent was already called.
-  void Wait() {
-    std::unique_lock<std::mutex> lock(mutex);
-    cv.wait(lock, [&]() { return event_occurred_; });
-  }
-  void OnEvent() {
-    {
-      std::unique_lock<std::mutex> lock(mutex);
-      event_occurred_ = true;
-    }
-    cv.notify_all();
-  }
-  EventObserver() = default;
-
- private:
-  EventObserver(const EventObserver&) = delete;
-  EventObserver& operator=(const EventObserver&) = delete;
-
-  std::mutex mutex;
-  std::condition_variable cv;
-  bool event_occurred_ = false;
-};
-
 // The definition of our custom data source. Instances of this class will be
 // automatically created and destroyed by Perfetto.
-class CustomDataSource : public perfetto::DataSource<CustomDataSource> {
- public:
-  CustomDataSource(EventObserver* event_observer)
-      : event_observer_(event_observer) {}
-  void OnStart(const StartArgs&) override { event_observer_->OnEvent(); }
+class CustomDataSource : public perfetto::DataSource<CustomDataSource> {};
 
- private:
-  EventObserver* event_observer_;
-};
-
-void InitializePerfetto(EventObserver* event_observer) {
+void InitializePerfetto() {
   perfetto::TracingInitArgs args;
   // The backends determine where trace events are recorded. For this example we
   // are going to use the system-wide tracing service, because the in-process
@@ -90,7 +56,7 @@
   // properties can be advertised too.
   perfetto::DataSourceDescriptor dsd;
   dsd.set_name("com.example.startup_trace");
-  CustomDataSource::Register(dsd, event_observer);
+  CustomDataSource::Register(dsd);
 }
 
 // The trace config defines which types of data sources are enabled for
@@ -106,7 +72,7 @@
 void StartStartupTracing() {
   perfetto::Tracing::SetupStartupTracingOpts args;
   args.backend = perfetto::kSystemBackend;
-  perfetto::Tracing::SetupStartupTracing(GetTraceConfig(), args);
+  perfetto::Tracing::SetupStartupTracingBlocking(GetTraceConfig(), args);
 }
 
 std::unique_ptr<perfetto::TracingSession> StartTracing() {
@@ -145,13 +111,9 @@
 PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(CustomDataSource);
 
 int main(int, const char**) {
-  EventObserver event_observer;
-  InitializePerfetto(&event_observer);
+  InitializePerfetto();
 
   StartStartupTracing();
-  // TODO(mohitms): Once we support `SetupStartupTracingBlocking`,
-  // it won't be required.
-  event_observer.Wait();
 
   // Write an event using our custom data source before starting tracing
   // session.