Bug 474369 - get rid of nsVoidArray, xpcom part; r=bsmedberg

This commit is contained in:
Arpad Borsos 2009-04-03 18:43:08 +02:00
Родитель 9ac5c0fe01
Коммит 4fc5b38c9d
11 изменённых файлов: 42 добавлений и 354 удалений

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

@ -39,7 +39,6 @@
#ifndef nsExceptionService_h__
#define nsExceptionService_h__
#include "nsVoidArray.h"
#include "nsIException.h"
#include "nsIExceptionService.h"
#include "nsIObserverService.h"

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

@ -39,7 +39,7 @@
#include "nsTraceRefcntImpl.h"
#include "nscore.h"
#include "nsISupports.h"
#include "nsVoidArray.h"
#include "nsTArray.h"
#include "prprf.h"
#include "prlog.h"
#include "plstr.h"
@ -278,7 +278,7 @@ public:
BloatEntry* entry = (BloatEntry*)he->value;
if (entry) {
entry->Accumulate();
static_cast<nsVoidArray*>(arg)->AppendElement(entry);
static_cast<nsTArray<BloatEntry*>*>(arg)->AppendElement(entry);
}
return HT_ENUMERATE_NEXT;
}
@ -456,6 +456,17 @@ static PRIntn DumpSerialNumbers(PLHashEntry* aHashEntry, PRIntn aIndex, void* aC
}
NS_SPECIALIZE_TEMPLATE
class nsDefaultComparator <BloatEntry*, BloatEntry*> {
public:
PRBool Equals(BloatEntry* const& aA, BloatEntry* const& aB) const {
return PL_strcmp(aA->GetClassName(), aB->GetClassName()) == 0;
}
PRBool LessThan(BloatEntry* const& aA, BloatEntry* const& aB) const {
return PL_strcmp(aA->GetClassName(), aB->GetClassName()) < 0;
}
};
#endif /* NS_IMPL_REFCNT_LOGGING */
NS_COM nsresult
@ -491,28 +502,16 @@ nsTraceRefcntImpl::DumpStatistics(StatisticsType type, FILE* out)
}
const PRBool leaked = total.PrintDumpHeader(out, msg, type);
nsVoidArray entries;
nsTArray<BloatEntry*> entries;
PL_HashTableEnumerateEntries(gBloatView, BloatEntry::DumpEntry, &entries);
const PRInt32 count = entries.Count();
const PRUint32 count = entries.Length();
if (!gLogLeaksOnly || leaked) {
// Sort the entries alphabetically by classname.
PRInt32 i, j;
for (i = count - 1; i >= 1; --i) {
for (j = i - 1; j >= 0; --j) {
BloatEntry* left = static_cast<BloatEntry*>(entries[i]);
BloatEntry* right = static_cast<BloatEntry*>(entries[j]);
entries.Sort();
if (PL_strcmp(left->GetClassName(), right->GetClassName()) < 0) {
entries.ReplaceElementAt(right, i);
entries.ReplaceElementAt(left, j);
}
}
}
// Enumerate from back-to-front, so things come out in alpha order
for (i = 0; i < count; ++i) {
BloatEntry* entry = static_cast<BloatEntry*>(entries[i]);
for (PRUint32 i = 0; i < count; ++i) {
BloatEntry* entry = entries[i];
entry->Dump(i, out, type);
}

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

@ -85,6 +85,7 @@
#include "nsThreadUtils.h"
#include "prthread.h"
#include "private/pprthred.h"
#include "nsTArray.h"
#include "nsInt64.h"
#include "nsManifestLineReader.h"
@ -329,9 +330,9 @@ private:
~PLDHashTableEnumeratorImpl();
void ReleaseElements();
nsVoidArray mElements;
PRInt32 mCount, mCurrent;
PRMonitor* mMonitor;
nsTArray<nsISupports*> mElements;
PRInt32 mCount, mCurrent;
PRMonitor* mMonitor;
struct Closure {
PRBool succeeded;
@ -401,9 +402,7 @@ void
PLDHashTableEnumeratorImpl::ReleaseElements()
{
for (PRInt32 i = 0; i < mCount; i++) {
nsISupports *supports = reinterpret_cast<nsISupports *>
(mElements[i]);
NS_IF_RELEASE(supports);
NS_IF_RELEASE(mElements[i]);
}
}
@ -476,7 +475,7 @@ PLDHashTableEnumeratorImpl::CurrentItem(nsISupports **retval)
if (!mCount || mCurrent == mCount)
return NS_ERROR_FAILURE;
*retval = reinterpret_cast<nsISupports *>(mElements[mCurrent]);
*retval = mElements[mCurrent];
if (*retval)
NS_ADDREF(*retval);

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

@ -40,7 +40,6 @@
#include "nsISupports.h"
#include "nsIModuleLoader.h"
#include "nsVoidArray.h"
#include "nsDataHashtable.h"
#include "nsHashKeys.h"
#include "nsIModule.h"

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

@ -42,7 +42,6 @@
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsVoidArray.h"
#include "nsIVariant.h"
#include "nsIWritablePropertyBag.h"

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

@ -51,7 +51,6 @@
#include "nsDebug.h"
#include "nsID.h"
#include "nsMemory.h"
#include "nsVoidArray.h"
#include "nsIFastLoadFileControl.h"
#include "nsIFastLoadService.h"

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

@ -50,7 +50,6 @@
#include "nsIDirectoryEnumerator.h"
#include "nsISimpleEnumerator.h"
#include "nsITimelineService.h"
#include "nsVoidArray.h"
#include "nsTArray.h"
#include "plbase64.h"
@ -58,7 +57,6 @@
#include "nsCRT.h"
#include "nsHashKeys.h"
#include "nsTArray.h"
#include "nsTraceRefcntImpl.h"
#include <Carbon/Carbon.h>

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

@ -1,302 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* 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 mozilla.org Code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1999
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of 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 ***** */
#include <stdlib.h>
#include <stdio.h>
#include "nsVoidBTree.h"
#include "nsVoidArray.h"
#define COUNT 1024
#define POINTER(i) reinterpret_cast<void*>(4 + 4 * (i))
static PRBool
Equal(const nsVoidArray& aControl, const nsVoidBTree& aTest)
{
if (aControl.Count() != aTest.Count()) {
printf("counts not equal; ");
return PR_FALSE;
}
for (PRInt32 i = aControl.Count() - 1; i >= 0; --i) {
if (aControl[i] != aTest[i]) {
printf("element %d differs; ", i);
return PR_FALSE;
}
}
return PR_TRUE;
}
static void
CheckForwardEnumeration(const nsVoidArray& aControl, const nsVoidBTree& aTest)
{
PRInt32 index = 0;
nsVoidBTree::ConstIterator last = aTest.Last();
for (nsVoidBTree::ConstIterator element = aTest.First(); element != last; ++element, ++index) {
if (*element != aControl[index]) {
printf("failed forward enumeration\n");
exit(-1);
}
}
if (index != aControl.Count()) {
printf("erratic termination during forward enumeration\n");
exit(-1);
}
}
static void
CheckBackwardEnumeration(const nsVoidArray& aControl, const nsVoidBTree& aTest)
{
PRInt32 index = aControl.Count();
nsVoidBTree::ConstIterator first = aTest.First();
nsVoidBTree::ConstIterator element = aTest.Last();
if (first != element) {
do {
if (*--element != aControl[--index]) {
printf("failed backward enumeration\n");
exit(-1);
}
} while (element != first);
}
if (index != 0) {
printf("erratic termination during backward enumeration\n");
exit(-1);
}
}
int main(int argc, char* argv[])
{
nsVoidBTree btree;
PRInt32 i;
//----------------------------------------
// Tail fill
for (i = 0; i < COUNT; ++i)
btree.InsertElementAt(reinterpret_cast<void*>(POINTER(i)), i);
for (i = 0; i < COUNT; ++i) {
if (btree[i] != POINTER(i)) {
printf("tail fill failed\n");
return -1;
}
}
printf("tail fill succeeded\n");
//----------------------------------------
// Tail empty
for (i = COUNT - 1; i >= 0; --i)
btree.RemoveElementAt(i);
if (btree.Count() != 0) {
printf("tail empty failed\n");
return -1;
}
printf("tail empty succeeded\n");
// N.B. no intervening Clear() to verify that we handle the re-use
// case.
//----------------------------------------
// Front fill
for (i = 0; i < COUNT; ++i)
btree.InsertElementAt(POINTER(i), 0);
for (i = 0; i < COUNT; ++i) {
if (btree[COUNT - (i + 1)] != POINTER(i)) {
printf("simple front fill failed\n");
return -1;
}
}
printf("front fill succeeded\n");
//----------------------------------------
// Front empty
for (i = COUNT - 1; i >= 0; --i)
btree.RemoveElementAt(0);
if (btree.Count() != 0) {
printf("front empty failed\n");
return -1;
}
printf("front empty succeeded\n");
fflush(stdout);
//----------------------------------------
// Test boundary conditions with small btree
{
printf("small btree boundary conditions ");
fflush(stdout);
nsVoidArray control;
btree.Clear();
CheckBackwardEnumeration(control, btree);
CheckForwardEnumeration(control, btree);
btree.AppendElement(POINTER(0));
control.AppendElement(POINTER(0));
CheckBackwardEnumeration(control, btree);
CheckForwardEnumeration(control, btree);
btree.AppendElement(POINTER(1));
control.AppendElement(POINTER(1));
CheckBackwardEnumeration(control, btree);
CheckForwardEnumeration(control, btree);
btree.RemoveElementAt(0);
btree.RemoveElementAt(0);
control.RemoveElementAt(0);
control.RemoveElementAt(0);
CheckBackwardEnumeration(control, btree);
CheckForwardEnumeration(control, btree);
printf("succeeded\n");
}
//----------------------------------------
// Iterator
{
nsVoidArray control;
btree.Clear();
// Fill
for (i = 0; i < COUNT; ++i) {
PRInt32 slot = i ? rand() % i : 0;
btree.InsertElementAt(POINTER(i), slot);
control.InsertElementAt(POINTER(i), slot);
if (! Equal(control, btree)) {
printf("failed\n");
return -1;
}
}
for (nsVoidBTree::Iterator m = btree.First(); m != btree.Last(); ++m) {
nsVoidBTree::Iterator n;
for (n = m, ++n; n != btree.Last(); ++n) {
if (*m > *n) {
void* tmp = *m;
*m = *n;
*n = tmp;
}
}
}
nsVoidBTree::Iterator el;
for (el = btree.First(), i = 0; el != btree.Last(); ++el, ++i) {
if (*el != POINTER(i)) {
printf("bubble sort failed\n");
return -1;
}
}
printf("iteration succeeded\n");
}
//----------------------------------------
// Random hammering
printf("random fill/empty: ");
for (PRInt32 iter = 10; iter >= 1; --iter) {
printf("%d ", iter);
fflush(stdout);
nsVoidArray control;
btree.Clear();
// Fill
for (i = 0; i < COUNT; ++i) {
PRInt32 slot = i ? rand() % i : 0;
btree.InsertElementAt(POINTER(i), slot);
control.InsertElementAt(POINTER(i), slot);
if (! Equal(control, btree)) {
printf("failed\n");
return -1;
}
}
// IndexOf
for (i = 0; i < COUNT; ++i) {
void* element = control[i];
if (btree.IndexOf(element) != i) {
printf("failed IndexOf at %d\n", i);
return -1;
}
}
// Backward enumeration
CheckBackwardEnumeration(control, btree);
// Forward enumeration
CheckForwardEnumeration(control, btree);
// Empty
for (i = COUNT - 1; i >= 0; --i) {
PRInt32 slot = i ? rand() % i : 0;
btree.RemoveElementAt(slot);
control.RemoveElementAt(slot);
if (! Equal(control, btree)) {
printf("failed\n");
return -1;
}
}
}
printf("succeeded\n");
return 0;
}

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

@ -74,7 +74,7 @@ TimerThread::~TimerThread()
mThread = nsnull;
NS_ASSERTION(mTimers.Count() == 0, "Timers remain in TimerThread::~TimerThread");
NS_ASSERTION(mTimers.IsEmpty(), "Timers remain in TimerThread::~TimerThread");
}
nsresult
@ -154,7 +154,7 @@ nsresult TimerThread::Shutdown()
if (!mThread)
return NS_ERROR_NOT_INITIALIZED;
nsVoidArray timers;
nsTArray<nsTimerImpl*> timers;
{ // lock scope
nsAutoLock lock(mLock);
@ -170,14 +170,13 @@ nsresult TimerThread::Shutdown()
// might potentially call some code reentering the same lock
// that leads to unexpected behavior or deadlock.
// See bug 422472.
PRBool rv = timers.AppendElements(mTimers);
NS_ASSERTION(rv, "Could not copy timers array, remaining timers will not be released");
timers.AppendElements(mTimers);
mTimers.Clear();
}
PRInt32 timersCount = timers.Count();
for (PRInt32 i = 0; i < timersCount; i++) {
nsTimerImpl *timer = static_cast<nsTimerImpl*>(timers[i]);
PRUint32 timersCount = timers.Length();
for (PRUint32 i = 0; i < timersCount; i++) {
nsTimerImpl *timer = timers[i];
timer->ReleaseCallback();
ReleaseTimerInternal(timer);
}
@ -257,8 +256,8 @@ NS_IMETHODIMP TimerThread::Run()
PRIntervalTime now = PR_IntervalNow();
nsTimerImpl *timer = nsnull;
if (mTimers.Count() > 0) {
timer = static_cast<nsTimerImpl*>(mTimers[0]);
if (!mTimers.IsEmpty()) {
timer = mTimers[0];
if (!TIMER_LESS_THAN(now, timer->mTimeout + mTimeoutAdjustment)) {
next:
@ -317,8 +316,8 @@ NS_IMETHODIMP TimerThread::Run()
}
}
if (mTimers.Count() > 0) {
timer = static_cast<nsTimerImpl *>(mTimers[0]);
if (!mTimers.IsEmpty()) {
timer = mTimers[0];
PRIntervalTime timeout = timer->mTimeout + mTimeoutAdjustment;
@ -412,10 +411,10 @@ PRInt32 TimerThread::AddTimerInternal(nsTimerImpl *aTimer)
return -1;
PRIntervalTime now = PR_IntervalNow();
PRInt32 count = mTimers.Count();
PRInt32 i = 0;
PRUint32 count = mTimers.Length();
PRUint32 i = 0;
for (; i < count; i++) {
nsTimerImpl *timer = static_cast<nsTimerImpl *>(mTimers[i]);
nsTimerImpl *timer = mTimers[i];
// Don't break till we have skipped any overdue timers. Do not include
// mTimeoutAdjustment here, because we are really trying to avoid calling
@ -432,7 +431,7 @@ PRInt32 TimerThread::AddTimerInternal(nsTimerImpl *aTimer)
}
}
if (!mTimers.InsertElementAt(aTimer, i))
if (!mTimers.InsertElementAt(i, aTimer))
return -1;
aTimer->mArmed = PR_TRUE;
@ -464,8 +463,8 @@ void TimerThread::DoBeforeSleep()
void TimerThread::DoAfterSleep()
{
mSleeping = PR_TRUE; // wake may be notified without preceding sleep notification
for (PRInt32 i = 0; i < mTimers.Count(); i ++) {
nsTimerImpl *timer = static_cast<nsTimerImpl*>(mTimers[i]);
for (PRUint32 i = 0; i < mTimers.Length(); i ++) {
nsTimerImpl *timer = mTimers[i];
// get and set the delay to cause its timeout to be recomputed
PRUint32 delay;
timer->GetDelay(&delay);

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

@ -47,7 +47,7 @@
#include "nsTimerImpl.h"
#include "nsVoidArray.h"
#include "nsTArray.h"
#include "prcvar.h"
#include "prinrval.h"
@ -101,7 +101,7 @@ private:
PRPackedBool mWaiting;
PRPackedBool mSleeping;
nsVoidArray mTimers;
nsTArray<nsTimerImpl*> mTimers;
#define DELAY_LINE_LENGTH_LOG2 5
#define DELAY_LINE_LENGTH_MASK PR_BITMASK(DELAY_LINE_LENGTH_LOG2)

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

@ -42,7 +42,6 @@
#include "TimerThread.h"
#include "nsAutoLock.h"
#include "nsAutoPtr.h"
#include "nsVoidArray.h"
#include "nsThreadManager.h"
#include "nsThreadUtils.h"
#include "prmem.h"