gecko-dev/js/public/AllocationRecording.h
Ted Campbell b172dd415c Bug 1716250 - Remove JS_FRIEND_API. r=jandem,sfink
Convert all JS_FRIEND_API to JS_PUBLIC_API. At this point, the JS_PUBLIC_API has
no formal curation process and in practice we add a lot of new features to
JS_FRIEND_API without giving much thought to if they should be public. The
result is that all embedders need to use the friend API in some form and the
distinction has lost meaning.

Going forward, we should continue to use the js/public/experimental directory as
a place to expose new APIs, and in general should strive for high quality of the
APIs that are exposed. If a particular API is tricky or discouraged, comments
explaining that will be more helpful that a losely applied FRIEND_API marker.

Differential Revision: https://phabricator.services.mozilla.com/D117607
2021-06-16 19:38:10 +00:00

74 lines
2.6 KiB
C++

/* -*- Mode: C++; tab-width: 8; 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 js_AllocationRecording_h
#define js_AllocationRecording_h
#include <stdint.h>
#include "jstypes.h"
#include "js/TypeDecls.h"
namespace JS {
/**
* This struct holds the information needed to create a profiler marker payload
* that can represent a JS allocation. It translates JS engine specific classes,
* into something that can be used in the profiler.
*/
struct RecordAllocationInfo {
RecordAllocationInfo(const char16_t* typeName, const char* className,
const char16_t* descriptiveTypeName,
const char* coarseType, uint64_t size, bool inNursery)
: typeName(typeName),
className(className),
descriptiveTypeName(descriptiveTypeName),
coarseType(coarseType),
size(size),
inNursery(inNursery) {}
// These pointers are borrowed from the UbiNode, and can point to live data.
// It is important for the consumers of this struct to correctly
// duplicate the strings to take ownership of them.
const char16_t* typeName;
const char* className;
const char16_t* descriptiveTypeName;
// The coarseType points to a string literal, so does not need to be
// duplicated.
const char* coarseType;
// The size in bytes of the allocation.
uint64_t size;
// Whether or not the allocation is in the nursery or not.
bool inNursery;
};
typedef void (*RecordAllocationsCallback)(RecordAllocationInfo&& info);
/**
* Enable recording JS allocations. This feature hooks into the object creation
* in the JavaScript engine, and reports back the allocation info through the
* callback. This allocation tracking is turned on for all encountered realms.
* The JS Debugger API can also turn on allocation tracking with its own
* probability. If both allocation tracking mechanisms are turned on at the same
* time, the Debugger's probability defers to the EnableRecordingAllocations's
* probability setting.
*/
JS_PUBLIC_API void EnableRecordingAllocations(
JSContext* cx, RecordAllocationsCallback callback, double probability);
/**
* Turn off JS allocation recording. If any JS Debuggers are also recording
* allocations, then the probability will be reset to the Debugger's desired
* setting.
*/
JS_PUBLIC_API void DisableRecordingAllocations(JSContext* cx);
} // namespace JS
#endif /* js_AllocationRecording_h */