Provide a way to forward sandbox decisions and syscalls interceptions to the profiler, with child-side stack in the reports. Introduces a new SandboxProfilerEmitter thread that will be able to deal with what cannot be done in the context of a signal handler. Child-side syscalls interceptions with stacks requires a bit of care because of the signal context it is running under. Taking a stack is safe in that context but dealing with the profiler is not, thus relying on the MPSCQueue data structure: - when in SIGSYS because a syscall has been intercepted, take a stack - forward the syscall informations plus the stack within the MPSCQueue - SandoxProfilerEmitter can then read from the queue and perform the heavy work with the profiler Differential Revision: https://phabricator.services.mozilla.com/D207736
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef SANDBOX_PROFILER_CHILD_H
|
|
#define SANDBOX_PROFILER_CHILD_H
|
|
|
|
#include "SandboxProfiler.h"
|
|
|
|
#if defined(HAVE_REPORT_UPROFILER_PARENT)
|
|
#error Cannot include SandboxProfilerChild.h when already included SandboxProfilerParent.h
|
|
#endif
|
|
|
|
#define HAVE_REPORT_UPROFILER_CHILD
|
|
|
|
namespace mozilla {
|
|
|
|
/* static */
|
|
bool SandboxProfiler::Init() {
|
|
MOZ_ASSERT(!sInSignalContext,
|
|
"SandboxProfiler::Init called in SIGSYS handler");
|
|
|
|
if (!uprofiler_initted) {
|
|
UPROFILER_GET(g);
|
|
if (g && !g(&uprofiler)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
MOZ_ASSERT(uprofiler.simple_event_marker_with_stack !=
|
|
simple_event_marker_with_stack_noop,
|
|
"Marker sym OK");
|
|
MOZ_ASSERT(uprofiler.native_backtrace != native_backtrace_noop,
|
|
"Backtrace sym OK");
|
|
|
|
if (uprofiler.native_backtrace &&
|
|
uprofiler.native_backtrace != native_backtrace_noop) {
|
|
uprofiler_initted = true;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // SANDBOX_PROFILER_CHILD_H
|