Blame widget/gtk/WidgetTraceEvent.cpp

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#include "mozilla/WidgetTraceEvent.h"
Packit f0b94e
Packit f0b94e
#include <glib.h>
Packit f0b94e
#include <mozilla/CondVar.h>
Packit f0b94e
#include <mozilla/Mutex.h>
Packit f0b94e
#include <stdio.h>
Packit f0b94e
Packit f0b94e
using mozilla::CondVar;
Packit f0b94e
using mozilla::Mutex;
Packit f0b94e
using mozilla::MutexAutoLock;
Packit f0b94e
Packit f0b94e
namespace {
Packit f0b94e
Packit f0b94e
Mutex* sMutex = nullptr;
Packit f0b94e
CondVar* sCondVar = nullptr;
Packit f0b94e
bool sTracerProcessed = false;
Packit f0b94e
Packit f0b94e
// This function is called from the main (UI) thread.
Packit f0b94e
gboolean TracerCallback(gpointer data) {
Packit f0b94e
  mozilla::SignalTracerThread();
Packit f0b94e
  return FALSE;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
}  // namespace
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
Packit f0b94e
bool InitWidgetTracing() {
Packit f0b94e
  sMutex = new Mutex("Event tracer thread mutex");
Packit f0b94e
  sCondVar = new CondVar(*sMutex, "Event tracer thread condvar");
Packit f0b94e
  return true;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
void CleanUpWidgetTracing() {
Packit f0b94e
  delete sMutex;
Packit f0b94e
  delete sCondVar;
Packit f0b94e
  sMutex = nullptr;
Packit f0b94e
  sCondVar = nullptr;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
// This function is called from the background tracer thread.
Packit f0b94e
bool FireAndWaitForTracerEvent() {
Packit f0b94e
  MOZ_ASSERT(sMutex && sCondVar, "Tracing not initialized!");
Packit f0b94e
Packit f0b94e
  // Send a default-priority idle event through the
Packit f0b94e
  // event loop, and wait for it to finish.
Packit f0b94e
  MutexAutoLock lock(*sMutex);
Packit f0b94e
  MOZ_ASSERT(!sTracerProcessed, "Tracer synchronization state is wrong");
Packit f0b94e
  g_idle_add_full(G_PRIORITY_DEFAULT, TracerCallback, nullptr, nullptr);
Packit f0b94e
  while (!sTracerProcessed) sCondVar->Wait();
Packit f0b94e
  sTracerProcessed = false;
Packit f0b94e
  return true;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
void SignalTracerThread() {
Packit f0b94e
  if (!sMutex || !sCondVar) return;
Packit f0b94e
  MutexAutoLock lock(*sMutex);
Packit f0b94e
  if (!sTracerProcessed) {
Packit f0b94e
    sTracerProcessed = true;
Packit f0b94e
    sCondVar->Notify();
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
}  // namespace mozilla