gecko-dev/mozglue/misc/AutoProfilerLabel.h
Aaron Klotz a69086ea54 Bug 1573273: Add ProfilerLabelBegin and ProfilerLabelEnd to mozglue; r=gerald
While mozglue continues to be the correct location for calling the affected
code in this patch, the calls requiring profiler labels will soon be
originating from firefox.exe via the launcher process.

mozglue will be supplying the launcher process with an interface that consists
of what are effectively "OnBeginDllLoad" and "OnEndDllLoad" callback
notifications; obviously an RAII class is not going to be useful for that case.

We still want to keep the RAII stuff around, however, since we still need it
for cases where we need to fall back to using the legacy DLL blocklist.

Differential Revision: https://phabricator.services.mozilla.com/D41807

--HG--
extra : moz-landing-system : lando
2019-08-14 03:46:41 +00:00

74 lines
2.7 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_AutoProfilerLabel_h
#define mozilla_AutoProfilerLabel_h
#include "mozilla/Attributes.h"
#include "mozilla/GuardObjects.h"
#include "mozilla/Tuple.h"
#include "mozilla/Types.h"
// The Gecko Profiler defines AutoProfilerLabel, an RAII class for
// pushing/popping frames to/from the ProfilingStack.
//
// This file defines a class of the same name that does much the same thing,
// but which can be used in (and only in) mozglue. A different class is
// necessary because mozglue cannot directly access sProfilingStack.
//
// Note that this class is slightly slower than the other AutoProfilerLabel,
// and it lacks the macro wrappers. It also is effectively hardwired to use
// JS::ProfilingCategory::OTHER as the category pair, because that's what
// the callbacks provided by the profiler use. (Specifying the categories in
// this file would require #including ProfilingCategory.h in mozglue, which we
// don't want to do.)
namespace mozilla {
// Enter should return a pointer that will be given to Exit.
typedef void* (*ProfilerLabelEnter)(const char* aLabel,
const char* aDynamicString, void* aSp);
typedef void (*ProfilerLabelExit)(void* EntryContext);
// Register callbacks that do the entry/exit work involving sProfilingStack.
MFBT_API void RegisterProfilerLabelEnterExit(ProfilerLabelEnter aEnter,
ProfilerLabelExit aExit);
// This #ifdef prevents this AutoProfilerLabel from being defined in libxul,
// which would conflict with the one in the profiler.
#ifdef IMPL_MFBT
class MOZ_RAII AutoProfilerLabel {
public:
AutoProfilerLabel(const char* aLabel,
const char* aDynamicString MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
~AutoProfilerLabel();
private:
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
void* mEntryContext;
// Number of RegisterProfilerLabelEnterExit calls, to avoid giving an entry
// context from one generation to the next.
uint32_t mGeneration;
};
using ProfilerLabel = Tuple<void*, uint32_t>;
bool IsProfilerPresent();
ProfilerLabel ProfilerLabelBegin(const char* aLabelName,
const char* aDynamicString, void* aSp);
void ProfilerLabelEnd(const ProfilerLabel& aLabel);
inline bool IsValidProfilerLabel(const ProfilerLabel& aLabel) {
return !!Get<0>(aLabel);
}
#endif
} // namespace mozilla
#endif // mozilla_AutoProfilerLabel_h