2012-03-09 01:48:50 -08:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
|
|
* vim: set ts=8 sw=4 et tw=99 ft=cpp:
|
|
|
|
*
|
|
|
|
* ***** BEGIN LICENSE BLOCK *****
|
2011-12-24 00:27:39 -08:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Original Code is about:memory glue.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Ms2ger <ms2ger@gmail.com>.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 2011
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
|
|
#ifndef js_MemoryMetrics_h
|
|
|
|
#define js_MemoryMetrics_h
|
|
|
|
|
|
|
|
/*
|
|
|
|
* These declarations are not within jsapi.h because they are highly likely
|
|
|
|
* to change in the future. Depend on them at your own risk.
|
|
|
|
*/
|
|
|
|
|
2012-01-11 00:23:08 -08:00
|
|
|
#include <string.h>
|
|
|
|
|
2012-01-11 00:23:08 -08:00
|
|
|
#include "jsalloc.h"
|
2011-12-24 00:27:39 -08:00
|
|
|
#include "jspubtd.h"
|
|
|
|
|
|
|
|
#include "js/Utility.h"
|
2012-01-11 00:23:08 -08:00
|
|
|
#include "js/Vector.h"
|
2011-12-24 00:27:39 -08:00
|
|
|
|
|
|
|
namespace JS {
|
|
|
|
|
|
|
|
/* Data for tracking analysis/inference memory usage. */
|
2012-01-26 19:09:31 -08:00
|
|
|
struct TypeInferenceSizes
|
2011-12-24 00:27:39 -08:00
|
|
|
{
|
2012-01-29 14:13:18 -08:00
|
|
|
size_t scripts;
|
|
|
|
size_t objects;
|
|
|
|
size_t tables;
|
|
|
|
size_t temporary;
|
2011-12-24 00:27:39 -08:00
|
|
|
};
|
|
|
|
|
2012-05-15 19:29:14 -07:00
|
|
|
// These measurements relate directly to the JSRuntime, and not to
|
|
|
|
// compartments within it.
|
|
|
|
struct RuntimeSizes
|
|
|
|
{
|
|
|
|
RuntimeSizes()
|
|
|
|
: object(0)
|
|
|
|
, atomsTable(0)
|
|
|
|
, contexts(0)
|
|
|
|
, dtoa(0)
|
|
|
|
, temporary(0)
|
|
|
|
, mjitCode(0)
|
|
|
|
, regexpCode(0)
|
|
|
|
, unusedCodeMemory(0)
|
|
|
|
, stackCommitted(0)
|
|
|
|
, gcMarker(0)
|
2012-05-15 19:30:28 -07:00
|
|
|
, mathCache(0)
|
|
|
|
, scriptFilenames(0)
|
|
|
|
, compartmentObjects(0)
|
2012-05-15 19:29:14 -07:00
|
|
|
{}
|
|
|
|
|
|
|
|
size_t object;
|
|
|
|
size_t atomsTable;
|
|
|
|
size_t contexts;
|
|
|
|
size_t dtoa;
|
|
|
|
size_t temporary;
|
|
|
|
size_t mjitCode;
|
|
|
|
size_t regexpCode;
|
|
|
|
size_t unusedCodeMemory;
|
|
|
|
size_t stackCommitted;
|
|
|
|
size_t gcMarker;
|
2012-05-15 19:30:28 -07:00
|
|
|
size_t mathCache;
|
|
|
|
size_t scriptFilenames;
|
|
|
|
|
|
|
|
// This is the exception to the "RuntimeSizes doesn't measure things within
|
|
|
|
// compartments" rule. We combine the sizes of all the JSCompartment
|
|
|
|
// objects into a single measurement because each one is fairly small, and
|
|
|
|
// they're all the same size.
|
|
|
|
size_t compartmentObjects;
|
2012-05-15 19:29:14 -07:00
|
|
|
};
|
|
|
|
|
2012-01-11 00:23:08 -08:00
|
|
|
struct CompartmentStats
|
|
|
|
{
|
2012-03-09 01:48:50 -08:00
|
|
|
CompartmentStats() {
|
2012-01-11 00:23:08 -08:00
|
|
|
memset(this, 0, sizeof(*this));
|
|
|
|
}
|
|
|
|
|
2012-03-09 01:48:50 -08:00
|
|
|
void *extra;
|
2012-01-29 14:13:18 -08:00
|
|
|
size_t gcHeapArenaHeaders;
|
|
|
|
size_t gcHeapArenaPadding;
|
|
|
|
size_t gcHeapArenaUnused;
|
|
|
|
|
|
|
|
size_t gcHeapObjectsNonFunction;
|
|
|
|
size_t gcHeapObjectsFunction;
|
|
|
|
size_t gcHeapStrings;
|
|
|
|
size_t gcHeapShapesTree;
|
|
|
|
size_t gcHeapShapesDict;
|
|
|
|
size_t gcHeapShapesBase;
|
|
|
|
size_t gcHeapScripts;
|
|
|
|
size_t gcHeapTypeObjects;
|
|
|
|
size_t gcHeapXML;
|
|
|
|
|
|
|
|
size_t objectSlots;
|
|
|
|
size_t objectElements;
|
2012-01-30 18:12:03 -08:00
|
|
|
size_t objectMisc;
|
2012-01-29 14:13:18 -08:00
|
|
|
size_t stringChars;
|
|
|
|
size_t shapesExtraTreeTables;
|
|
|
|
size_t shapesExtraDictTables;
|
|
|
|
size_t shapesExtraTreeShapeKids;
|
|
|
|
size_t shapesCompartmentTables;
|
|
|
|
size_t scriptData;
|
|
|
|
size_t mjitData;
|
2012-05-15 19:31:01 -07:00
|
|
|
size_t crossCompartmentWrappers;
|
2012-05-03 00:12:47 -07:00
|
|
|
|
2012-01-26 19:09:31 -08:00
|
|
|
TypeInferenceSizes typeInferenceSizes;
|
2012-01-11 00:23:08 -08:00
|
|
|
};
|
|
|
|
|
2012-01-29 14:11:32 -08:00
|
|
|
struct RuntimeStats
|
2012-01-11 00:23:08 -08:00
|
|
|
{
|
2012-03-09 01:48:50 -08:00
|
|
|
RuntimeStats(JSMallocSizeOfFun mallocSizeOf)
|
2012-05-15 19:29:14 -07:00
|
|
|
: runtime()
|
2012-01-11 00:23:08 -08:00
|
|
|
, gcHeapChunkTotal(0)
|
2012-04-15 19:20:54 -07:00
|
|
|
, gcHeapCommitted(0)
|
|
|
|
, gcHeapUnused(0)
|
2012-01-11 00:23:08 -08:00
|
|
|
, gcHeapChunkCleanUnused(0)
|
|
|
|
, gcHeapChunkDirtyUnused(0)
|
|
|
|
, gcHeapChunkCleanDecommitted(0)
|
|
|
|
, gcHeapChunkDirtyDecommitted(0)
|
|
|
|
, gcHeapArenaUnused(0)
|
|
|
|
, gcHeapChunkAdmin(0)
|
|
|
|
, totalObjects(0)
|
|
|
|
, totalShapes(0)
|
|
|
|
, totalScripts(0)
|
|
|
|
, totalStrings(0)
|
|
|
|
, totalMjit(0)
|
|
|
|
, totalTypeInference(0)
|
|
|
|
, totalAnalysisTemp(0)
|
|
|
|
, compartmentStatsVector()
|
|
|
|
, currCompartmentStats(NULL)
|
|
|
|
, mallocSizeOf(mallocSizeOf)
|
|
|
|
{}
|
|
|
|
|
2012-05-15 19:29:14 -07:00
|
|
|
js::RuntimeSizes runtime;
|
|
|
|
|
2012-01-29 14:13:18 -08:00
|
|
|
size_t gcHeapChunkTotal;
|
2012-04-15 19:20:54 -07:00
|
|
|
size_t gcHeapCommitted;
|
|
|
|
size_t gcHeapUnused;
|
2012-01-29 14:13:18 -08:00
|
|
|
size_t gcHeapChunkCleanUnused;
|
|
|
|
size_t gcHeapChunkDirtyUnused;
|
|
|
|
size_t gcHeapChunkCleanDecommitted;
|
|
|
|
size_t gcHeapChunkDirtyDecommitted;
|
|
|
|
size_t gcHeapArenaUnused;
|
|
|
|
size_t gcHeapChunkAdmin;
|
|
|
|
size_t totalObjects;
|
|
|
|
size_t totalShapes;
|
|
|
|
size_t totalScripts;
|
|
|
|
size_t totalStrings;
|
|
|
|
size_t totalMjit;
|
|
|
|
size_t totalTypeInference;
|
|
|
|
size_t totalAnalysisTemp;
|
2012-01-11 00:23:08 -08:00
|
|
|
|
|
|
|
js::Vector<CompartmentStats, 0, js::SystemAllocPolicy> compartmentStatsVector;
|
|
|
|
CompartmentStats *currCompartmentStats;
|
|
|
|
|
|
|
|
JSMallocSizeOfFun mallocSizeOf;
|
2012-03-09 01:48:50 -08:00
|
|
|
|
|
|
|
virtual void initExtraCompartmentStats(JSCompartment *c, CompartmentStats *cstats) = 0;
|
2012-01-11 00:23:08 -08:00
|
|
|
};
|
|
|
|
|
2012-01-11 08:21:26 -08:00
|
|
|
#ifdef JS_THREADSAFE
|
|
|
|
|
2012-01-11 00:23:08 -08:00
|
|
|
extern JS_PUBLIC_API(bool)
|
2012-01-29 14:11:32 -08:00
|
|
|
CollectRuntimeStats(JSRuntime *rt, RuntimeStats *rtStats);
|
2012-01-11 00:23:08 -08:00
|
|
|
|
2012-02-29 12:23:53 -08:00
|
|
|
extern JS_PUBLIC_API(int64_t)
|
|
|
|
GetExplicitNonHeapForRuntime(JSRuntime *rt, JSMallocSizeOfFun mallocSizeOf);
|
2012-01-11 00:23:08 -08:00
|
|
|
|
2012-01-11 08:21:26 -08:00
|
|
|
#endif /* JS_THREADSAFE */
|
|
|
|
|
2011-12-24 00:27:39 -08:00
|
|
|
extern JS_PUBLIC_API(size_t)
|
|
|
|
SystemCompartmentCount(const JSRuntime *rt);
|
|
|
|
|
|
|
|
extern JS_PUBLIC_API(size_t)
|
|
|
|
UserCompartmentCount(const JSRuntime *rt);
|
|
|
|
|
|
|
|
} // namespace JS
|
|
|
|
|
|
|
|
#endif // js_MemoryMetrics_h
|