зеркало из https://github.com/mozilla/gecko-dev.git
Bug 848560 (part 2) - Prevent memory reporters from being registered while about:memory's tests are running. r=jlebar.
--HG-- extra : rebase_source : 3187fef1c6910b637788499de47bef6718018c0a
This commit is contained in:
Родитель
8ca600972c
Коммит
9f600a37f0
|
@ -26,6 +26,7 @@
|
|||
|
||||
// Remove all the real reporters and multi-reporters; save them to
|
||||
// restore at the end.
|
||||
mgr.blockRegistration();
|
||||
var e = mgr.enumerateReporters();
|
||||
var realReporters = [];
|
||||
while (e.hasMoreElements()) {
|
||||
|
@ -131,10 +132,10 @@
|
|||
];
|
||||
|
||||
for (var i = 0; i < fakeReporters.length; i++) {
|
||||
mgr.registerReporter(fakeReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(fakeReporters[i]);
|
||||
}
|
||||
for (var i = 0; i < fakeMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(fakeMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(fakeMultiReporters[i]);
|
||||
}
|
||||
]]>
|
||||
</script>
|
||||
|
@ -193,11 +194,13 @@ Ghost Windows\n\
|
|||
mgr.unregisterMultiReporter(fakeMultiReporters[i]);
|
||||
}
|
||||
for (var i = 0; i < realReporters.length; i++) {
|
||||
mgr.registerReporter(realReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(realReporters[i]);
|
||||
}
|
||||
for (var i = 0; i < realMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(realMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(realMultiReporters[i]);
|
||||
}
|
||||
mgr.unblockRegistration();
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
// Remove all the real reporters and multi-reporters; save them to
|
||||
// restore at the end.
|
||||
mgr.blockRegistration();
|
||||
let e = mgr.enumerateReporters();
|
||||
let realReporters = [];
|
||||
while (e.hasMoreElements()) {
|
||||
|
@ -162,10 +163,10 @@
|
|||
}
|
||||
];
|
||||
for (let i = 0; i < fakeReporters.length; i++) {
|
||||
mgr.registerReporter(fakeReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(fakeReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < fakeMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(fakeMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(fakeMultiReporters[i]);
|
||||
}
|
||||
|
||||
// mgr.explicit sums "heap-allocated" and all the appropriate NONHEAP ones:
|
||||
|
@ -243,7 +244,7 @@
|
|||
f("5th", "explicit/b/c/i/j", NONHEAP, 5 * KB)
|
||||
];
|
||||
for (let i = 0; i < fakeReporters2.length; i++) {
|
||||
mgr.registerReporter(fakeReporters2[i]);
|
||||
mgr.registerReporterEvenIfBlocked(fakeReporters2[i]);
|
||||
}
|
||||
fakeReporters = fakeReporters.concat(fakeReporters2);
|
||||
]]>
|
||||
|
@ -595,11 +596,13 @@ Other Measurements\n\
|
|||
mgr.unregisterMultiReporter(fakeMultiReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realReporters.length; i++) {
|
||||
mgr.registerReporter(realReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(realReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(realMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(realMultiReporters[i]);
|
||||
}
|
||||
mgr.unblockRegistration();
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
// Remove all the real reporters and multi-reporters; save them to
|
||||
// restore at the end.
|
||||
mgr.blockRegistration();
|
||||
let e = mgr.enumerateReporters();
|
||||
let realReporters = [];
|
||||
while (e.hasMoreElements()) {
|
||||
|
@ -78,7 +79,7 @@
|
|||
];
|
||||
|
||||
for (let i = 0; i < fakeReporters.length; i++) {
|
||||
mgr.registerReporter(fakeReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(fakeReporters[i]);
|
||||
}
|
||||
|
||||
]]>
|
||||
|
@ -97,11 +98,13 @@
|
|||
mgr.unregisterReporter(fakeReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realReporters.length; i++) {
|
||||
mgr.registerReporter(realReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(realReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(realMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(realMultiReporters[i]);
|
||||
}
|
||||
mgr.unblockRegistration();
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
// Remove all the real reporters and multi-reporters; save them to
|
||||
// restore at the end.
|
||||
mgr.blockRegistration();
|
||||
let e = mgr.enumerateReporters();
|
||||
let realReporters = [];
|
||||
while (e.hasMoreElements()) {
|
||||
|
@ -64,7 +65,7 @@
|
|||
];
|
||||
|
||||
for (let i = 0; i < fakeReporters.length; i++) {
|
||||
mgr.registerReporter(fakeReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(fakeReporters[i]);
|
||||
}
|
||||
|
||||
]]>
|
||||
|
@ -84,11 +85,13 @@
|
|||
mgr.unregisterReporter(fakeReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realReporters.length; i++) {
|
||||
mgr.registerReporter(realReporters[i]);
|
||||
mgr.registerReporterEvenIfBlocked(realReporters[i]);
|
||||
}
|
||||
for (let i = 0; i < realMultiReporters.length; i++) {
|
||||
mgr.registerMultiReporter(realMultiReporters[i]);
|
||||
mgr.registerMultiReporterEvenIfBlocked(realMultiReporters[i]);
|
||||
}
|
||||
mgr.unblockRegistration();
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
|
|
@ -228,7 +228,7 @@ interface nsIMemoryMultiReporter : nsISupports
|
|||
readonly attribute int64_t explicitNonHeap;
|
||||
};
|
||||
|
||||
[scriptable, builtinclass, uuid(0baaa958-3112-4952-b557-2a0c57eabb8f)]
|
||||
[scriptable, builtinclass, uuid(70b0e608-8dbf-4dc7-b88f-f1c745c1b48c)]
|
||||
interface nsIMemoryReporterManager : nsISupports
|
||||
{
|
||||
/*
|
||||
|
@ -267,6 +267,14 @@ interface nsIMemoryReporterManager : nsISupports
|
|||
*/
|
||||
void unregisterMultiReporter (in nsIMemoryMultiReporter reporter);
|
||||
|
||||
/**
|
||||
* These functions should only be used for testing purposes.
|
||||
*/
|
||||
void blockRegistration();
|
||||
void unblockRegistration();
|
||||
void registerReporterEvenIfBlocked(in nsIMemoryReporter aReporter);
|
||||
void registerMultiReporterEvenIfBlocked(in nsIMemoryMultiReporter aReporter);
|
||||
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
|
|
|
@ -822,7 +822,8 @@ HashtableEnumerator::GetNext(nsISupports** aNext)
|
|||
} // anonymous namespace
|
||||
|
||||
nsMemoryReporterManager::nsMemoryReporterManager()
|
||||
: mMutex("nsMemoryReporterManager::mMutex")
|
||||
: mMutex("nsMemoryReporterManager::mMutex"),
|
||||
mIsRegistrationBlocked(false)
|
||||
{
|
||||
mReporters.Init();
|
||||
mMultiReporters.Init();
|
||||
|
@ -877,13 +878,14 @@ DebugAssertRefcountIsNonZero(nsISupports* aObj)
|
|||
#endif
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::RegisterReporter(nsIMemoryReporter *reporter)
|
||||
nsresult
|
||||
nsMemoryReporterManager::RegisterReporterHelper(
|
||||
nsIMemoryReporter *reporter, bool aForce)
|
||||
{
|
||||
// This method is thread-safe.
|
||||
mozilla::MutexAutoLock autoLock(mMutex);
|
||||
|
||||
if (mReporters.Contains(reporter)) {
|
||||
if ((mIsRegistrationBlocked && !aForce) || mReporters.Contains(reporter)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -908,12 +910,27 @@ nsMemoryReporterManager::RegisterReporter(nsIMemoryReporter *reporter)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::RegisterMultiReporter(nsIMemoryMultiReporter *reporter)
|
||||
nsMemoryReporterManager::RegisterReporter(nsIMemoryReporter *reporter)
|
||||
{
|
||||
return RegisterReporterHelper(reporter, /* force = */ false);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::RegisterReporterEvenIfBlocked(
|
||||
nsIMemoryReporter *reporter)
|
||||
{
|
||||
return RegisterReporterHelper(reporter, /* force = */ true);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsMemoryReporterManager::RegisterMultiReporterHelper(
|
||||
nsIMemoryMultiReporter *reporter, bool aForce)
|
||||
{
|
||||
// This method is thread-safe.
|
||||
mozilla::MutexAutoLock autoLock(mMutex);
|
||||
|
||||
if (mMultiReporters.Contains(reporter)) {
|
||||
if ((mIsRegistrationBlocked && !aForce) ||
|
||||
mMultiReporters.Contains(reporter)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -927,6 +944,19 @@ nsMemoryReporterManager::RegisterMultiReporter(nsIMemoryMultiReporter *reporter)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::RegisterMultiReporter(nsIMemoryMultiReporter *reporter)
|
||||
{
|
||||
return RegisterMultiReporterHelper(reporter, /* force = */ false);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::RegisterMultiReporterEvenIfBlocked(
|
||||
nsIMemoryMultiReporter *reporter)
|
||||
{
|
||||
return RegisterMultiReporterHelper(reporter, /* force = */ true);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::UnregisterReporter(nsIMemoryReporter *reporter)
|
||||
{
|
||||
|
@ -955,6 +985,30 @@ nsMemoryReporterManager::UnregisterMultiReporter(nsIMemoryMultiReporter *reporte
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::BlockRegistration()
|
||||
{
|
||||
// This method is thread-safe.
|
||||
mozilla::MutexAutoLock autoLock(mMutex);
|
||||
if (mIsRegistrationBlocked) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mIsRegistrationBlocked = true;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::UnblockRegistration()
|
||||
{
|
||||
// This method is thread-safe.
|
||||
mozilla::MutexAutoLock autoLock(mMutex);
|
||||
if (!mIsRegistrationBlocked) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mIsRegistrationBlocked = false;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemoryReporterManager::GetResident(int64_t *aResident)
|
||||
{
|
||||
|
|
|
@ -23,9 +23,14 @@ public:
|
|||
virtual ~nsMemoryReporterManager();
|
||||
|
||||
private:
|
||||
nsresult RegisterReporterHelper(nsIMemoryReporter *reporter, bool aForce);
|
||||
nsresult RegisterMultiReporterHelper(nsIMemoryMultiReporter *reporter,
|
||||
bool aForce);
|
||||
|
||||
nsTHashtable<nsISupportsHashKey> mReporters;
|
||||
nsTHashtable<nsISupportsHashKey> mMultiReporters;
|
||||
Mutex mMutex;
|
||||
bool mIsRegistrationBlocked;
|
||||
};
|
||||
|
||||
#define NS_MEMORY_REPORTER_MANAGER_CID \
|
||||
|
|
Загрузка…
Ссылка в новой задаче