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