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:
Nicholas Nethercote 2013-04-01 21:39:44 -07:00
Родитель 8ca600972c
Коммит 9f600a37f0
7 изменённых файлов: 101 добавлений и 22 удалений

Просмотреть файл

@ -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 \