зеркало из https://github.com/mozilla/gecko-dev.git
Bug 474369 - get rid of nsVoidArray, xpcom part; r=bsmedberg
This commit is contained in:
Родитель
9ac5c0fe01
Коммит
4fc5b38c9d
|
@ -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"
|
||||
|
|
Загрузка…
Ссылка в новой задаче