mozglue/misc/AutoProfilerLabel.h
author Gerald Squelart <gsquelart@mozilla.com>
Thu, 04 Jul 2019 04:38:16 +0000
changeset 481213 8fed7bc35767fdfab4bac0908ae9b21c08f49e1f
parent 459686 26fb2a868911021c586ca56d64ede136ae28c015
child 481214 c9da4cd2c6f56a3b6034c41fb208e583ba0cbcd3
permissions -rw-r--r--
Bug 1559000 - mozglue's AutoProfilerLabel doesn't need to know about ProfilingStack - r=mstange `ProfilingStack*` happens to be the information that the current Gecko Profiler entry function wants to forward to the exit function, but AutoProfilerLabel does not really need to know about that. Changing it to `void*`, so that we can later use different entry/exit functions that use different context types. Differential Revision: https://phabricator.services.mozilla.com/D34806

/* -*- 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/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;
};

#endif

}  // namespace mozilla

#endif  // mozilla_AutoProfilerLabel_h