2004-09-01 19:55:58 +00:00
|
|
|
/* vim:set ts=4 sw=4 sts=4 et cin: */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2003-09-11 20:32:33 +00:00
|
|
|
|
|
|
|
#ifndef nsHostResolver_h__
|
|
|
|
#define nsHostResolver_h__
|
|
|
|
|
|
|
|
#include "nscore.h"
|
2011-03-28 19:58:49 +00:00
|
|
|
#include "nsAtomicRefcnt.h"
|
2003-09-11 20:32:33 +00:00
|
|
|
#include "prclist.h"
|
|
|
|
#include "prnetdb.h"
|
|
|
|
#include "pldhash.h"
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-04-01 04:29:02 +00:00
|
|
|
#include "mozilla/CondVar.h"
|
|
|
|
#include "mozilla/Mutex.h"
|
2003-10-07 05:11:41 +00:00
|
|
|
#include "nsISupportsImpl.h"
|
2012-01-20 23:14:46 +00:00
|
|
|
#include "nsIDNSListener.h"
|
2011-07-21 13:18:01 +00:00
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsTArray.h"
|
2003-09-11 20:32:33 +00:00
|
|
|
|
|
|
|
class nsHostResolver;
|
|
|
|
class nsHostRecord;
|
2003-10-07 05:11:41 +00:00
|
|
|
class nsResolveHostCallback;
|
2003-09-11 20:32:33 +00:00
|
|
|
|
|
|
|
/* XXX move this someplace more generic */
|
2005-11-15 17:30:50 +00:00
|
|
|
#define NS_DECL_REFCOUNTED_THREADSAFE(classname) \
|
|
|
|
private: \
|
|
|
|
nsAutoRefCnt _refc; \
|
|
|
|
public: \
|
|
|
|
PRInt32 AddRef() { \
|
2011-03-28 19:58:49 +00:00
|
|
|
PRInt32 n = NS_AtomicIncrementRefcnt(_refc); \
|
2005-11-15 17:30:50 +00:00
|
|
|
NS_LOG_ADDREF(this, n, #classname, sizeof(classname)); \
|
|
|
|
return n; \
|
|
|
|
} \
|
|
|
|
PRInt32 Release() { \
|
2011-03-28 19:58:49 +00:00
|
|
|
PRInt32 n = NS_AtomicDecrementRefcnt(_refc); \
|
2005-11-15 17:30:50 +00:00
|
|
|
NS_LOG_RELEASE(this, n, #classname); \
|
|
|
|
if (n == 0) \
|
|
|
|
delete this; \
|
|
|
|
return n; \
|
2003-09-11 20:32:33 +00:00
|
|
|
}
|
|
|
|
|
2008-11-07 23:00:26 +00:00
|
|
|
#define MAX_RESOLVER_THREADS_FOR_ANY_PRIORITY 3
|
|
|
|
#define MAX_RESOLVER_THREADS_FOR_HIGH_PRIORITY 5
|
2011-10-12 22:01:24 +00:00
|
|
|
#define MAX_NON_PRIORITY_REQUESTS 150
|
|
|
|
|
2008-11-07 23:00:26 +00:00
|
|
|
#define MAX_RESOLVER_THREADS (MAX_RESOLVER_THREADS_FOR_ANY_PRIORITY + \
|
|
|
|
MAX_RESOLVER_THREADS_FOR_HIGH_PRIORITY)
|
|
|
|
|
2004-09-01 19:55:58 +00:00
|
|
|
struct nsHostKey
|
|
|
|
{
|
|
|
|
const char *host;
|
|
|
|
PRUint16 flags;
|
|
|
|
PRUint16 af;
|
|
|
|
};
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
/**
|
2003-10-07 05:11:41 +00:00
|
|
|
* nsHostRecord - ref counted object type stored in host resolver cache.
|
2003-09-11 20:32:33 +00:00
|
|
|
*/
|
2004-09-01 19:55:58 +00:00
|
|
|
class nsHostRecord : public PRCList, public nsHostKey
|
2003-09-11 20:32:33 +00:00
|
|
|
{
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-04-01 04:29:02 +00:00
|
|
|
typedef mozilla::Mutex Mutex;
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
public:
|
2005-11-15 17:30:50 +00:00
|
|
|
NS_DECL_REFCOUNTED_THREADSAFE(nsHostRecord)
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2003-10-07 05:11:41 +00:00
|
|
|
/* instantiates a new host record */
|
2004-09-01 19:55:58 +00:00
|
|
|
static nsresult Create(const nsHostKey *key, nsHostRecord **record);
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2004-04-17 00:57:26 +00:00
|
|
|
/* a fully resolved host record has either a non-null |addr_info| or |addr|
|
|
|
|
* field. if |addr_info| is null, it implies that the |host| is an IP
|
2003-10-07 05:11:41 +00:00
|
|
|
* address literal. in which case, |addr| contains the parsed address.
|
2004-04-17 00:57:26 +00:00
|
|
|
* otherwise, if |addr_info| is non-null, then it contains one or many
|
|
|
|
* IP addresses corresponding to the given host name. if both |addr_info|
|
2003-10-07 05:11:41 +00:00
|
|
|
* and |addr| are null, then the given host has not yet been fully resolved.
|
2004-03-09 20:31:54 +00:00
|
|
|
* |af| is the address family of the record we are querying for.
|
2003-10-07 05:11:41 +00:00
|
|
|
*/
|
2004-09-01 19:55:58 +00:00
|
|
|
|
2007-12-11 21:45:42 +00:00
|
|
|
/* the lock protects |addr_info| and |addr_info_gencnt| because they
|
|
|
|
* are mutable and accessed by the resolver worker thread and the
|
|
|
|
* nsDNSService2 class. |addr| doesn't change after it has been
|
|
|
|
* assigned a value. only the resolver worker thread modifies
|
|
|
|
* nsHostRecord (and only in nsHostResolver::OnLookupComplete);
|
|
|
|
* the other threads just read it. therefore the resolver worker
|
|
|
|
* thread doesn't need to lock when reading |addr_info|.
|
|
|
|
*/
|
2011-07-21 13:18:01 +00:00
|
|
|
Mutex addr_info_lock;
|
2007-12-11 21:45:42 +00:00
|
|
|
int addr_info_gencnt; /* generation count of |addr_info| */
|
2008-10-13 21:04:09 +00:00
|
|
|
PRAddrInfo *addr_info;
|
2004-09-01 19:55:58 +00:00
|
|
|
PRNetAddr *addr;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool negative; /* True if this record is a cache of a failed lookup.
|
2008-10-13 21:04:09 +00:00
|
|
|
Negative cache entries are valid just like any other
|
|
|
|
(though never for more than 60 seconds), but a use
|
|
|
|
of that negative entry forces an asynchronous refresh. */
|
|
|
|
|
2004-09-01 19:55:58 +00:00
|
|
|
PRUint32 expiration; /* measured in minutes since epoch */
|
2003-10-07 05:11:41 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HasResult() const { return addr_info || addr || negative; }
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2011-07-21 13:18:01 +00:00
|
|
|
// hold addr_info_lock when calling the blacklist functions
|
2011-09-29 06:19:26 +00:00
|
|
|
bool Blacklisted(PRNetAddr *query);
|
2011-07-21 13:18:01 +00:00
|
|
|
void ResetBlacklist();
|
|
|
|
void ReportUnusable(PRNetAddr *addr);
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
private:
|
2003-10-07 05:11:41 +00:00
|
|
|
friend class nsHostResolver;
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2003-10-25 23:48:33 +00:00
|
|
|
PRCList callbacks; /* list of callbacks */
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool resolving; /* true if this record is being resolved, which means
|
2003-10-25 23:48:33 +00:00
|
|
|
* that it is either on the pending queue or owned by
|
|
|
|
* one of the worker threads. */
|
2008-11-07 23:00:26 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool onQueue; /* true if pending and on the queue (not yet given to getaddrinfo())*/
|
|
|
|
bool usingAnyThread; /* true if off queue and contributing to mActiveAnyThreadCount */
|
2003-10-07 05:11:41 +00:00
|
|
|
|
2011-07-21 13:18:01 +00:00
|
|
|
// a list of addresses associated with this record that have been reported
|
|
|
|
// as unusable. the list is kept as a set of strings to make it independent
|
|
|
|
// of gencnt.
|
|
|
|
nsTArray<nsCString> mBlacklistedItems;
|
|
|
|
|
|
|
|
nsHostRecord(const nsHostKey *key); /* use Create() instead */
|
2003-10-07 05:11:41 +00:00
|
|
|
~nsHostRecord();
|
2003-09-11 20:32:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ResolveHost callback object. It's PRCList members are used by
|
|
|
|
* the nsHostResolver and should not be used by anything else.
|
|
|
|
*/
|
2003-10-07 05:11:41 +00:00
|
|
|
class NS_NO_VTABLE nsResolveHostCallback : public PRCList
|
2003-09-11 20:32:33 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
2003-10-07 05:11:41 +00:00
|
|
|
* OnLookupComplete
|
|
|
|
*
|
|
|
|
* this function is called to complete a host lookup initiated by
|
|
|
|
* nsHostResolver::ResolveHost. it may be invoked recursively from
|
|
|
|
* ResolveHost or on an unspecified background thread.
|
2003-09-11 20:32:33 +00:00
|
|
|
*
|
2003-10-07 05:11:41 +00:00
|
|
|
* NOTE: it is the responsibility of the implementor of this method
|
|
|
|
* to handle the callback in a thread safe manner.
|
2003-09-11 20:32:33 +00:00
|
|
|
*
|
|
|
|
* @param resolver
|
|
|
|
* nsHostResolver object associated with this result
|
2003-10-07 05:11:41 +00:00
|
|
|
* @param record
|
|
|
|
* the host record containing the results of the lookup
|
2003-09-11 20:32:33 +00:00
|
|
|
* @param status
|
2003-10-07 05:11:41 +00:00
|
|
|
* if successful, |record| contains non-null results
|
2003-09-11 20:32:33 +00:00
|
|
|
*/
|
|
|
|
virtual void OnLookupComplete(nsHostResolver *resolver,
|
2003-10-07 05:11:41 +00:00
|
|
|
nsHostRecord *record,
|
|
|
|
nsresult status) = 0;
|
2012-01-20 23:14:46 +00:00
|
|
|
/**
|
|
|
|
* EqualsAsyncListener
|
|
|
|
*
|
|
|
|
* Determines if the listener argument matches the listener member var.
|
|
|
|
* For subclasses not implementing a member listener, should return false.
|
|
|
|
* For subclasses having a member listener, the function should check if
|
|
|
|
* they are the same. Used for cases where a pointer to an object
|
|
|
|
* implementing nsResolveHostCallback is unknown, but a pointer to
|
|
|
|
* the original listener is known.
|
|
|
|
*
|
|
|
|
* @param aListener
|
|
|
|
* nsIDNSListener object associated with the original request
|
|
|
|
*/
|
|
|
|
virtual bool EqualsAsyncListener(nsIDNSListener *aListener) = 0;
|
2003-09-11 20:32:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2003-10-07 05:11:41 +00:00
|
|
|
* nsHostResolver - an asynchronous host name resolver.
|
2003-09-11 20:32:33 +00:00
|
|
|
*/
|
|
|
|
class nsHostResolver
|
|
|
|
{
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-04-01 04:29:02 +00:00
|
|
|
typedef mozilla::CondVar CondVar;
|
|
|
|
typedef mozilla::Mutex Mutex;
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
public:
|
2003-10-07 05:11:41 +00:00
|
|
|
/**
|
|
|
|
* host resolver instances are reference counted.
|
|
|
|
*/
|
2005-11-15 17:30:50 +00:00
|
|
|
NS_DECL_REFCOUNTED_THREADSAFE(nsHostResolver)
|
2003-10-07 05:11:41 +00:00
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
/**
|
|
|
|
* creates an addref'd instance of a nsHostResolver object.
|
|
|
|
*/
|
|
|
|
static nsresult Create(PRUint32 maxCacheEntries, // zero disables cache
|
|
|
|
PRUint32 maxCacheLifetime, // minutes
|
2011-12-17 02:24:12 +00:00
|
|
|
PRUint32 lifetimeGracePeriod, // minutes
|
2003-09-11 20:32:33 +00:00
|
|
|
nsHostResolver **resolver);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* puts the resolver in the shutdown state, which will cause any pending
|
|
|
|
* callbacks to be detached. any future calls to ResolveHost will fail.
|
|
|
|
*/
|
|
|
|
void Shutdown();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* resolve the given hostname asynchronously. the caller can synthesize
|
|
|
|
* a synchronous host lookup using a lock and a cvar. as noted above
|
|
|
|
* the callback will occur re-entrantly from an unspecified thread. the
|
|
|
|
* host lookup cannot be canceled (cancelation can be layered above this
|
|
|
|
* by having the callback implementation return without doing anything).
|
|
|
|
*/
|
2003-10-07 05:11:41 +00:00
|
|
|
nsresult ResolveHost(const char *hostname,
|
2004-09-01 19:55:58 +00:00
|
|
|
PRUint16 flags,
|
|
|
|
PRUint16 af,
|
|
|
|
nsResolveHostCallback *callback);
|
2003-09-11 20:32:33 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* removes the specified callback from the nsHostRecord for the given
|
2004-09-01 19:55:58 +00:00
|
|
|
* hostname, flags, and address family. these parameters should correspond
|
|
|
|
* to the parameters passed to ResolveHost. this function executes the
|
2005-04-06 01:33:28 +00:00
|
|
|
* callback if the callback is still pending with the given status.
|
2003-09-11 20:32:33 +00:00
|
|
|
*/
|
2003-10-07 05:11:41 +00:00
|
|
|
void DetachCallback(const char *hostname,
|
2004-09-01 19:55:58 +00:00
|
|
|
PRUint16 flags,
|
|
|
|
PRUint16 af,
|
2005-04-06 01:33:28 +00:00
|
|
|
nsResolveHostCallback *callback,
|
|
|
|
nsresult status);
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2012-01-20 23:14:46 +00:00
|
|
|
/**
|
|
|
|
* Cancels an async request associated with the hostname, flags,
|
|
|
|
* address family and listener. Cancels first callback found which matches
|
|
|
|
* these criteria. These parameters should correspond to the parameters
|
|
|
|
* passed to ResolveHost. If this is the last callback associated with the
|
|
|
|
* host record, it is removed from any request queues it might be on.
|
|
|
|
*/
|
|
|
|
void CancelAsyncRequest(const char *host,
|
|
|
|
PRUint16 flags,
|
|
|
|
PRUint16 af,
|
|
|
|
nsIDNSListener *aListener,
|
|
|
|
nsresult status);
|
2004-09-01 19:55:58 +00:00
|
|
|
/**
|
|
|
|
* values for the flags parameter passed to ResolveHost and DetachCallback
|
|
|
|
* that may be bitwise OR'd together.
|
|
|
|
*
|
|
|
|
* NOTE: in this implementation, these flags correspond exactly in value
|
|
|
|
* to the flags defined on nsIDNSService.
|
|
|
|
*/
|
|
|
|
enum {
|
|
|
|
RES_BYPASS_CACHE = 1 << 0,
|
2008-11-07 23:00:26 +00:00
|
|
|
RES_CANON_NAME = 1 << 1,
|
|
|
|
RES_PRIORITY_MEDIUM = 1 << 2,
|
2009-05-06 21:26:33 +00:00
|
|
|
RES_PRIORITY_LOW = 1 << 3,
|
|
|
|
RES_SPECULATE = 1 << 4
|
2004-09-01 19:55:58 +00:00
|
|
|
};
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
private:
|
2011-12-17 02:24:12 +00:00
|
|
|
nsHostResolver(PRUint32 maxCacheEntries = 50, PRUint32 maxCacheLifetime = 1,
|
|
|
|
PRUint32 lifetimeGracePeriod = 0);
|
2003-09-11 20:32:33 +00:00
|
|
|
~nsHostResolver();
|
|
|
|
|
|
|
|
nsresult Init();
|
|
|
|
nsresult IssueLookup(nsHostRecord *);
|
2011-09-29 06:19:26 +00:00
|
|
|
bool GetHostToLookup(nsHostRecord **m);
|
2003-09-11 20:32:33 +00:00
|
|
|
void OnLookupComplete(nsHostRecord *, nsresult, PRAddrInfo *);
|
2008-11-07 23:00:26 +00:00
|
|
|
void DeQueue(PRCList &aQ, nsHostRecord **aResult);
|
|
|
|
void ClearPendingQueue(PRCList *aPendingQueue);
|
|
|
|
nsresult ConditionallyCreateThread(nsHostRecord *rec);
|
|
|
|
|
|
|
|
static void MoveQueue(nsHostRecord *aRec, PRCList &aDestQ);
|
|
|
|
|
2008-10-10 15:04:34 +00:00
|
|
|
static void ThreadFunc(void *);
|
2003-09-11 20:32:33 +00:00
|
|
|
|
2011-12-17 02:24:17 +00:00
|
|
|
enum {
|
|
|
|
METHOD_HIT = 1,
|
|
|
|
METHOD_RENEWAL = 2,
|
|
|
|
METHOD_NEGATIVE_HIT = 3,
|
|
|
|
METHOD_LITERAL = 4,
|
|
|
|
METHOD_OVERFLOW = 5,
|
|
|
|
METHOD_NETWORK_FIRST = 6,
|
|
|
|
METHOD_NETWORK_SHARED = 7
|
|
|
|
};
|
|
|
|
|
2003-09-11 20:32:33 +00:00
|
|
|
PRUint32 mMaxCacheEntries;
|
|
|
|
PRUint32 mMaxCacheLifetime;
|
2011-12-17 02:24:12 +00:00
|
|
|
PRUint32 mGracePeriod;
|
Rollup of bug 645263 and bug 646259: Switch to mozilla:: sync primitives. r=cjones,dbaron,doublec,ehsan src=bsmedberg
Bug 645263, part 0: Count sync primitive ctor/dtors. r=dbaron
Bug 645263, part 1: Migrate content/media to mozilla:: sync primitives. r=doublec
Bug 645263, part 2: Migrate modules/plugin to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 3: Migrate nsComponentManagerImpl to mozilla:: sync primitives. sr=bsmedberg
Bug 645263, part 4: Migrate everything else to mozilla:: sync primitives. r=dbaron
Bug 645263, part 5: Remove nsAutoLock.*. sr=bsmedberg
Bug 645263, part 6: Make editor test be nicer to deadlock detector. r=ehsan
Bug 645263, part 7: Disable tracemalloc backtraces for xpcshell tests. r=dbaron
Bug 646259: Fix nsCacheService to use a CondVar for notifying. r=cjones
2011-04-01 04:29:02 +00:00
|
|
|
Mutex mLock;
|
|
|
|
CondVar mIdleThreadCV;
|
2008-11-07 23:00:26 +00:00
|
|
|
PRUint32 mNumIdleThreads;
|
2003-09-11 20:32:33 +00:00
|
|
|
PRUint32 mThreadCount;
|
2009-01-14 17:18:27 +00:00
|
|
|
PRUint32 mActiveAnyThreadCount;
|
2003-09-11 20:32:33 +00:00
|
|
|
PLDHashTable mDB;
|
2008-11-07 23:00:26 +00:00
|
|
|
PRCList mHighQ;
|
|
|
|
PRCList mMediumQ;
|
|
|
|
PRCList mLowQ;
|
2003-09-11 20:32:33 +00:00
|
|
|
PRCList mEvictionQ;
|
|
|
|
PRUint32 mEvictionQSize;
|
2008-11-07 23:00:26 +00:00
|
|
|
PRUint32 mPendingCount;
|
2003-09-11 20:32:33 +00:00
|
|
|
PRTime mCreationTime;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool mShutdown;
|
2008-11-07 23:00:26 +00:00
|
|
|
PRIntervalTime mLongIdleTimeout;
|
|
|
|
PRIntervalTime mShortIdleTimeout;
|
2003-09-11 20:32:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // nsHostResolver_h__
|