зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1668867 - profiler_{start,stop,etc.} return the ProfilerParent::Profiler...ed GenericPromise - r=canaltinova
Differential Revision: https://phabricator.services.mozilla.com/D139334
This commit is contained in:
Родитель
f2d47478d0
Коммит
875656f23f
|
@ -4740,11 +4740,10 @@ static void NotifyObservers(const char* aTopic,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NotifyProfilerStarted(const PowerOfTwo32& aCapacity,
|
[[nodiscard]] static RefPtr<GenericPromise> NotifyProfilerStarted(
|
||||||
const Maybe<double>& aDuration,
|
const PowerOfTwo32& aCapacity, const Maybe<double>& aDuration,
|
||||||
double aInterval, uint32_t aFeatures,
|
double aInterval, uint32_t aFeatures, const char** aFilters,
|
||||||
const char** aFilters, uint32_t aFilterCount,
|
uint32_t aFilterCount, uint64_t aActiveTabID) {
|
||||||
uint64_t aActiveTabID) {
|
|
||||||
nsTArray<nsCString> filtersArray;
|
nsTArray<nsCString> filtersArray;
|
||||||
for (size_t i = 0; i < aFilterCount; ++i) {
|
for (size_t i = 0; i < aFilterCount; ++i) {
|
||||||
filtersArray.AppendElement(aFilters[i]);
|
filtersArray.AppendElement(aFilters[i]);
|
||||||
|
@ -4754,8 +4753,9 @@ static void NotifyProfilerStarted(const PowerOfTwo32& aCapacity,
|
||||||
aCapacity.Value(), aDuration, aInterval, aFeatures,
|
aCapacity.Value(), aDuration, aInterval, aFeatures,
|
||||||
std::move(filtersArray), aActiveTabID);
|
std::move(filtersArray), aActiveTabID);
|
||||||
|
|
||||||
ProfilerParent::ProfilerStarted(params);
|
RefPtr<GenericPromise> startPromise = ProfilerParent::ProfilerStarted(params);
|
||||||
NotifyObservers("profiler-started", params);
|
NotifyObservers("profiler-started", params);
|
||||||
|
return startPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void locked_profiler_start(PSLockRef aLock, PowerOfTwo32 aCapacity,
|
static void locked_profiler_start(PSLockRef aLock, PowerOfTwo32 aCapacity,
|
||||||
|
@ -5061,8 +5061,8 @@ void profiler_init(void* aStackTop) {
|
||||||
|
|
||||||
// We do this with gPSMutex unlocked. The comment in profiler_stop() explains
|
// We do this with gPSMutex unlocked. The comment in profiler_stop() explains
|
||||||
// why.
|
// why.
|
||||||
NotifyProfilerStarted(capacity, duration, interval, features, filters.begin(),
|
Unused << NotifyProfilerStarted(capacity, duration, interval, features,
|
||||||
filters.length(), 0);
|
filters.begin(), filters.length(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void locked_profiler_save_profile_to_file(
|
static void locked_profiler_save_profile_to_file(
|
||||||
|
@ -5118,7 +5118,7 @@ void profiler_shutdown(IsFastShutdown aIsFastShutdown) {
|
||||||
// We do these operations with gPSMutex unlocked. The comments in
|
// We do these operations with gPSMutex unlocked. The comments in
|
||||||
// profiler_stop() explain why.
|
// profiler_stop() explain why.
|
||||||
if (samplerThread) {
|
if (samplerThread) {
|
||||||
ProfilerParent::ProfilerStopped();
|
Unused << ProfilerParent::ProfilerStopped();
|
||||||
NotifyObservers("profiler-stopped");
|
NotifyObservers("profiler-stopped");
|
||||||
delete samplerThread;
|
delete samplerThread;
|
||||||
}
|
}
|
||||||
|
@ -5627,9 +5627,10 @@ static void locked_profiler_start(PSLockRef aLock, PowerOfTwo32 aCapacity,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_start(PowerOfTwo32 aCapacity, double aInterval,
|
RefPtr<GenericPromise> profiler_start(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
uint32_t aFeatures, const char** aFilters,
|
uint32_t aFeatures, const char** aFilters,
|
||||||
uint32_t aFilterCount, uint64_t aActiveTabID,
|
uint32_t aFilterCount,
|
||||||
|
uint64_t aActiveTabID,
|
||||||
const Maybe<double>& aDuration) {
|
const Maybe<double>& aDuration) {
|
||||||
LOG("profiler_start");
|
LOG("profiler_start");
|
||||||
|
|
||||||
|
@ -5668,12 +5669,12 @@ void profiler_start(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
// We do these operations with gPSMutex unlocked. The comments in
|
// We do these operations with gPSMutex unlocked. The comments in
|
||||||
// profiler_stop() explain why.
|
// profiler_stop() explain why.
|
||||||
if (samplerThread) {
|
if (samplerThread) {
|
||||||
ProfilerParent::ProfilerStopped();
|
Unused << ProfilerParent::ProfilerStopped();
|
||||||
NotifyObservers("profiler-stopped");
|
NotifyObservers("profiler-stopped");
|
||||||
delete samplerThread;
|
delete samplerThread;
|
||||||
}
|
}
|
||||||
NotifyProfilerStarted(aCapacity, aDuration, aInterval, aFeatures, aFilters,
|
return NotifyProfilerStarted(aCapacity, aDuration, aInterval, aFeatures,
|
||||||
aFilterCount, aActiveTabID);
|
aFilters, aFilterCount, aActiveTabID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval,
|
void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
|
@ -5719,7 +5720,7 @@ void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
// We do these operations with gPSMutex unlocked. The comments in
|
// We do these operations with gPSMutex unlocked. The comments in
|
||||||
// profiler_stop() explain why.
|
// profiler_stop() explain why.
|
||||||
if (samplerThread) {
|
if (samplerThread) {
|
||||||
ProfilerParent::ProfilerStopped();
|
Unused << ProfilerParent::ProfilerStopped();
|
||||||
NotifyObservers("profiler-stopped");
|
NotifyObservers("profiler-stopped");
|
||||||
delete samplerThread;
|
delete samplerThread;
|
||||||
}
|
}
|
||||||
|
@ -5727,8 +5728,8 @@ void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
if (startedProfiler) {
|
if (startedProfiler) {
|
||||||
invoke_profiler_state_change_callbacks(ProfilingState::Started);
|
invoke_profiler_state_change_callbacks(ProfilingState::Started);
|
||||||
|
|
||||||
NotifyProfilerStarted(aCapacity, aDuration, aInterval, aFeatures, aFilters,
|
Unused << NotifyProfilerStarted(aCapacity, aDuration, aInterval, aFeatures,
|
||||||
aFilterCount, aActiveTabID);
|
aFilters, aFilterCount, aActiveTabID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5800,7 +5801,7 @@ void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval,
|
||||||
return samplerThread;
|
return samplerThread;
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_stop() {
|
RefPtr<GenericPromise> profiler_stop() {
|
||||||
LOG("profiler_stop");
|
LOG("profiler_stop");
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
||||||
|
@ -5822,7 +5823,7 @@ void profiler_stop() {
|
||||||
PSAutoLock lock;
|
PSAutoLock lock;
|
||||||
|
|
||||||
if (!ActivePS::Exists(lock)) {
|
if (!ActivePS::Exists(lock)) {
|
||||||
return;
|
return GenericPromise::CreateAndResolve(/* unused */ true, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
samplerThread = locked_profiler_stop(lock);
|
samplerThread = locked_profiler_stop(lock);
|
||||||
|
@ -5833,7 +5834,7 @@ void profiler_stop() {
|
||||||
// locks gPSMutex, for example when it wants to insert a marker.
|
// locks gPSMutex, for example when it wants to insert a marker.
|
||||||
// (This has been seen in practise in bug 1346356, when we were still firing
|
// (This has been seen in practise in bug 1346356, when we were still firing
|
||||||
// these notifications synchronously.)
|
// these notifications synchronously.)
|
||||||
ProfilerParent::ProfilerStopped();
|
RefPtr<GenericPromise> promise = ProfilerParent::ProfilerStopped();
|
||||||
NotifyObservers("profiler-stopped");
|
NotifyObservers("profiler-stopped");
|
||||||
|
|
||||||
// We delete with gPSMutex unlocked. Otherwise we would get a deadlock: we
|
// We delete with gPSMutex unlocked. Otherwise we would get a deadlock: we
|
||||||
|
@ -5846,6 +5847,8 @@ void profiler_stop() {
|
||||||
// in a way that's safe with respect to other gPSMutex-locking operations
|
// in a way that's safe with respect to other gPSMutex-locking operations
|
||||||
// that may have occurred in the meantime.
|
// that may have occurred in the meantime.
|
||||||
delete samplerThread;
|
delete samplerThread;
|
||||||
|
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool profiler_is_paused() {
|
bool profiler_is_paused() {
|
||||||
|
@ -5871,7 +5874,7 @@ bool profiler_is_paused() {
|
||||||
return ActivePS::AppendPostSamplingCallback(lock, std::move(aCallback));
|
return ActivePS::AppendPostSamplingCallback(lock, std::move(aCallback));
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_pause() {
|
RefPtr<GenericPromise> profiler_pause() {
|
||||||
LOG("profiler_pause");
|
LOG("profiler_pause");
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
||||||
|
@ -5882,7 +5885,7 @@ void profiler_pause() {
|
||||||
PSAutoLock lock;
|
PSAutoLock lock;
|
||||||
|
|
||||||
if (!ActivePS::Exists(lock)) {
|
if (!ActivePS::Exists(lock)) {
|
||||||
return;
|
return GenericPromise::CreateAndResolve(/* unused */ true, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(GP_OS_android)
|
#if defined(GP_OS_android)
|
||||||
|
@ -5899,11 +5902,12 @@ void profiler_pause() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
||||||
ProfilerParent::ProfilerPaused();
|
RefPtr<GenericPromise> promise = ProfilerParent::ProfilerPaused();
|
||||||
NotifyObservers("profiler-paused");
|
NotifyObservers("profiler-paused");
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_resume() {
|
RefPtr<GenericPromise> profiler_resume() {
|
||||||
LOG("profiler_resume");
|
LOG("profiler_resume");
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
||||||
|
@ -5912,7 +5916,7 @@ void profiler_resume() {
|
||||||
PSAutoLock lock;
|
PSAutoLock lock;
|
||||||
|
|
||||||
if (!ActivePS::Exists(lock)) {
|
if (!ActivePS::Exists(lock)) {
|
||||||
return;
|
return GenericPromise::CreateAndResolve(/* unused */ true, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivePS::Buffer(lock).AddEntry(
|
ActivePS::Buffer(lock).AddEntry(
|
||||||
|
@ -5930,10 +5934,12 @@ void profiler_resume() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
||||||
ProfilerParent::ProfilerResumed();
|
RefPtr<GenericPromise> promise = ProfilerParent::ProfilerResumed();
|
||||||
NotifyObservers("profiler-resumed");
|
NotifyObservers("profiler-resumed");
|
||||||
|
|
||||||
invoke_profiler_state_change_callbacks(ProfilingState::Resumed);
|
invoke_profiler_state_change_callbacks(ProfilingState::Resumed);
|
||||||
|
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool profiler_is_sampling_paused() {
|
bool profiler_is_sampling_paused() {
|
||||||
|
@ -5948,7 +5954,7 @@ bool profiler_is_sampling_paused() {
|
||||||
return ActivePS::IsSamplingPaused(lock);
|
return ActivePS::IsSamplingPaused(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_pause_sampling() {
|
RefPtr<GenericPromise> profiler_pause_sampling() {
|
||||||
LOG("profiler_pause_sampling");
|
LOG("profiler_pause_sampling");
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
||||||
|
@ -5957,7 +5963,7 @@ void profiler_pause_sampling() {
|
||||||
PSAutoLock lock;
|
PSAutoLock lock;
|
||||||
|
|
||||||
if (!ActivePS::Exists(lock)) {
|
if (!ActivePS::Exists(lock)) {
|
||||||
return;
|
return GenericPromise::CreateAndResolve(/* unused */ true, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(GP_OS_android)
|
#if defined(GP_OS_android)
|
||||||
|
@ -5975,11 +5981,12 @@ void profiler_pause_sampling() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
||||||
ProfilerParent::ProfilerPausedSampling();
|
RefPtr<GenericPromise> promise = ProfilerParent::ProfilerPausedSampling();
|
||||||
NotifyObservers("profiler-paused-sampling");
|
NotifyObservers("profiler-paused-sampling");
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
void profiler_resume_sampling() {
|
RefPtr<GenericPromise> profiler_resume_sampling() {
|
||||||
LOG("profiler_resume_sampling");
|
LOG("profiler_resume_sampling");
|
||||||
|
|
||||||
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
MOZ_RELEASE_ASSERT(CorePS::Exists());
|
||||||
|
@ -5988,7 +5995,7 @@ void profiler_resume_sampling() {
|
||||||
PSAutoLock lock;
|
PSAutoLock lock;
|
||||||
|
|
||||||
if (!ActivePS::Exists(lock)) {
|
if (!ActivePS::Exists(lock)) {
|
||||||
return;
|
return GenericPromise::CreateAndResolve(/* unused */ true, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActivePS::Buffer(lock).AddEntry(
|
ActivePS::Buffer(lock).AddEntry(
|
||||||
|
@ -6006,8 +6013,9 @@ void profiler_resume_sampling() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
// gPSMutex must be unlocked when we notify, to avoid potential deadlocks.
|
||||||
ProfilerParent::ProfilerResumedSampling();
|
RefPtr<GenericPromise> promise = ProfilerParent::ProfilerResumedSampling();
|
||||||
NotifyObservers("profiler-resumed-sampling");
|
NotifyObservers("profiler-resumed-sampling");
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool profiler_feature_active(uint32_t aFeature) {
|
bool profiler_feature_active(uint32_t aFeature) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ static inline void profiler_shutdown(
|
||||||
|
|
||||||
# include "mozilla/Attributes.h"
|
# include "mozilla/Attributes.h"
|
||||||
# include "mozilla/Maybe.h"
|
# include "mozilla/Maybe.h"
|
||||||
|
# include "mozilla/MozPromise.h"
|
||||||
# include "mozilla/PowerOfTwo.h"
|
# include "mozilla/PowerOfTwo.h"
|
||||||
# include "mozilla/Vector.h"
|
# include "mozilla/Vector.h"
|
||||||
|
|
||||||
|
@ -115,14 +116,18 @@ void profiler_shutdown(IsFastShutdown aIsFastShutdown = IsFastShutdown::No);
|
||||||
// It's being used to determine the profiled tab. It's "0" if
|
// It's being used to determine the profiled tab. It's "0" if
|
||||||
// we failed to get the ID.
|
// we failed to get the ID.
|
||||||
// "aDuration" is the duration of entries in the profiler's circular buffer.
|
// "aDuration" is the duration of entries in the profiler's circular buffer.
|
||||||
void profiler_start(
|
// Returns as soon as this process' profiler has started, the returned promise
|
||||||
|
// gets resolved when profilers in sub-processes (if any) have started.
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_start(
|
||||||
mozilla::PowerOfTwo32 aCapacity, double aInterval, uint32_t aFeatures,
|
mozilla::PowerOfTwo32 aCapacity, double aInterval, uint32_t aFeatures,
|
||||||
const char** aFilters, uint32_t aFilterCount, uint64_t aActiveTabID,
|
const char** aFilters, uint32_t aFilterCount, uint64_t aActiveTabID,
|
||||||
const mozilla::Maybe<double>& aDuration = mozilla::Nothing());
|
const mozilla::Maybe<double>& aDuration = mozilla::Nothing());
|
||||||
|
|
||||||
// Stop the profiler and discard the profile without saving it. A no-op if the
|
// Stop the profiler and discard the profile without saving it. A no-op if the
|
||||||
// profiler is inactive. After stopping the profiler is "inactive".
|
// profiler is inactive. After stopping the profiler is "inactive".
|
||||||
void profiler_stop();
|
// Returns as soon as this process' profiler has stopped, the returned promise
|
||||||
|
// gets resolved when profilers in sub-processes (if any) have stopped.
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_stop();
|
||||||
|
|
||||||
// If the profiler is inactive, start it. If it's already active, restart it if
|
// If the profiler is inactive, start it. If it's already active, restart it if
|
||||||
// the requested settings differ from the current settings. Both the check and
|
// the requested settings differ from the current settings. Both the check and
|
||||||
|
@ -144,13 +149,19 @@ void profiler_ensure_started(
|
||||||
// Timeline markers will still be stored. This feature will keep JavaScript
|
// Timeline markers will still be stored. This feature will keep JavaScript
|
||||||
// profiling enabled, thus allowing toggling the profiler without invalidating
|
// profiling enabled, thus allowing toggling the profiler without invalidating
|
||||||
// the JIT.
|
// the JIT.
|
||||||
void profiler_pause();
|
// Returns as soon as this process' profiler has paused/resumed, the returned
|
||||||
void profiler_resume();
|
// promise gets resolved when profilers in sub-processes (if any) have
|
||||||
|
// paused/resumed.
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_pause();
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_resume();
|
||||||
|
|
||||||
// Only pause and resume the periodic sampling loop, including stack sampling,
|
// Only pause and resume the periodic sampling loop, including stack sampling,
|
||||||
// counters, and profiling overheads.
|
// counters, and profiling overheads.
|
||||||
void profiler_pause_sampling();
|
// Returns as soon as this process' profiler has paused/resumed sampling, the
|
||||||
void profiler_resume_sampling();
|
// returned promise gets resolved when profilers in sub-processes (if any) have
|
||||||
|
// paused/resumed sampling.
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_pause_sampling();
|
||||||
|
RefPtr<mozilla::GenericPromise> profiler_resume_sampling();
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Get information from the profiler
|
// Get information from the profiler
|
||||||
|
|
|
@ -74,14 +74,14 @@ class ProfilerParent final : public PProfilerParent {
|
||||||
// This will start the profiler in all child processes. The returned promise
|
// This will start the profiler in all child processes. The returned promise
|
||||||
// will be resolved when all child have completed their operation
|
// will be resolved when all child have completed their operation
|
||||||
// (successfully or not.)
|
// (successfully or not.)
|
||||||
static RefPtr<GenericPromise> ProfilerStarted(
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerStarted(
|
||||||
nsIProfilerStartParams* aParams);
|
nsIProfilerStartParams* aParams);
|
||||||
static void ProfilerWillStopIfStarted();
|
static void ProfilerWillStopIfStarted();
|
||||||
static RefPtr<GenericPromise> ProfilerStopped();
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerStopped();
|
||||||
static RefPtr<GenericPromise> ProfilerPaused();
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerPaused();
|
||||||
static RefPtr<GenericPromise> ProfilerResumed();
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerResumed();
|
||||||
static RefPtr<GenericPromise> ProfilerPausedSampling();
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerPausedSampling();
|
||||||
static RefPtr<GenericPromise> ProfilerResumedSampling();
|
[[nodiscard]] static RefPtr<GenericPromise> ProfilerResumedSampling();
|
||||||
static void ClearAllPages();
|
static void ClearAllPages();
|
||||||
|
|
||||||
// Create a "Final" update that the Child can return to its Parent.
|
// Create a "Final" update that the Child can return to its Parent.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче