From 11a8d31d813535f021483ff498c41cb1694f2499 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Mon, 11 Apr 2011 23:17:43 -0700 Subject: [PATCH] Backout changeset e6d044d30abf (bug 607741) for not compiling. --- .../base/src/nsSocketTransportService2.cpp | 166 +++--------------- netwerk/base/src/nsSocketTransportService2.h | 23 +-- netwerk/protocol/http/nsHttpHandler.cpp | 6 +- 3 files changed, 30 insertions(+), 165 deletions(-) diff --git a/netwerk/base/src/nsSocketTransportService2.cpp b/netwerk/base/src/nsSocketTransportService2.cpp index e9083de37170..c24e624cc3d0 100644 --- a/netwerk/base/src/nsSocketTransportService2.cpp +++ b/netwerk/base/src/nsSocketTransportService2.cpp @@ -64,8 +64,6 @@ nsSocketTransportService *gSocketTransportService = nsnull; PRThread *gSocketThread = nsnull; #define SEND_BUFFER_PREF "network.tcp.sendbuffer" -#define SOCKET_LIMIT_TARGET 550U -#define SOCKET_LIMIT_MIN 50U //----------------------------------------------------------------------------- // ctor/dtor (called on the main/UI thread by the service manager) @@ -77,8 +75,6 @@ nsSocketTransportService::nsSocketTransportService() , mLock("nsSocketTransportService::mLock") , mInitialized(PR_FALSE) , mShuttingDown(PR_FALSE) - , mActiveListSize(SOCKET_LIMIT_MIN) - , mIdleListSize(SOCKET_LIMIT_MIN) , mActiveCount(0) , mIdleCount(0) , mSendBufferSize(0) @@ -89,14 +85,6 @@ nsSocketTransportService::nsSocketTransportService() NS_ASSERTION(NS_IsMainThread(), "wrong thread"); - PR_CallOnce(&gMaxCountInitOnce, DiscoverMaxCount); - mActiveList = (SocketContext *) - moz_xmalloc(sizeof(SocketContext) * mActiveListSize); - mIdleList = (SocketContext *) - moz_xmalloc(sizeof(SocketContext) * mIdleListSize); - mPollList = (PRPollDesc *) - moz_xmalloc(sizeof(PRPollDesc) * (mActiveListSize + 1)); - NS_ASSERTION(!gSocketTransportService, "must not instantiate twice"); gSocketTransportService = this; } @@ -109,9 +97,6 @@ nsSocketTransportService::~nsSocketTransportService() if (mThreadEvent) PR_DestroyPollableEvent(mThreadEvent); - moz_free(mActiveList); - moz_free(mIdleList); - moz_free(mPollList); gSocketTransportService = nsnull; } @@ -192,11 +177,9 @@ nsSocketTransportService::AttachSocket(PRFileDesc *fd, nsASocketHandler *handler } nsresult -nsSocketTransportService::DetachSocket(SocketContext *listHead, SocketContext *sock) +nsSocketTransportService::DetachSocket(SocketContext *sock) { SOCKET_LOG(("nsSocketTransportService::DetachSocket [handler=%x]\n", sock->mHandler)); - NS_ABORT_IF_FALSE((listHead == mActiveList) || (listHead == mIdleList), - "DetachSocket invalid head"); // inform the handler that this socket is going away sock->mHandler->OnSocketDetached(sock->mFD); @@ -205,7 +188,9 @@ nsSocketTransportService::DetachSocket(SocketContext *listHead, SocketContext *s sock->mFD = nsnull; NS_RELEASE(sock->mHandler); - if (listHead == mActiveList) + // find out what list this is on. + PRUint32 index = sock - mActiveList; + if (index < NS_SOCKET_MAX_COUNT) RemoveFromPollList(sock); else RemoveFromIdleList(sock); @@ -226,18 +211,13 @@ nsSocketTransportService::DetachSocket(SocketContext *listHead, SocketContext *s nsresult nsSocketTransportService::AddToPollList(SocketContext *sock) { - NS_ABORT_IF_FALSE(!(((PRUint32)(sock - mActiveList)) < mActiveListSize), - "AddToPollList Socket Already Active"); - SOCKET_LOG(("nsSocketTransportService::AddToPollList [handler=%x]\n", sock->mHandler)); - if (mActiveCount == mActiveListSize) { - SOCKET_LOG((" Active List size of %d met\n", mActiveCount)); - if (!GrowActiveList()) { - NS_ERROR("too many active sockets"); - return NS_ERROR_OUT_OF_MEMORY; - } + + if (mActiveCount == NS_SOCKET_MAX_COUNT) { + NS_ERROR("too many active sockets"); + return NS_ERROR_UNEXPECTED; } - + mActiveList[mActiveCount] = *sock; mActiveCount++; @@ -255,7 +235,7 @@ nsSocketTransportService::RemoveFromPollList(SocketContext *sock) SOCKET_LOG(("nsSocketTransportService::RemoveFromPollList [handler=%x]\n", sock->mHandler)); PRUint32 index = sock - mActiveList; - NS_ABORT_IF_FALSE(index < mActiveListSize, "invalid index"); + NS_ASSERTION(index < NS_SOCKET_MAX_COUNT, "invalid index"); SOCKET_LOG((" index=%u mActiveCount=%u\n", index, mActiveCount)); @@ -271,16 +251,11 @@ nsSocketTransportService::RemoveFromPollList(SocketContext *sock) nsresult nsSocketTransportService::AddToIdleList(SocketContext *sock) { - NS_ABORT_IF_FALSE(!(((PRUint32)(sock - mIdleList)) < mIdleListSize), - "AddToIdlelList Socket Already Idle"); - SOCKET_LOG(("nsSocketTransportService::AddToIdleList [handler=%x]\n", sock->mHandler)); - if (mIdleCount == mIdleListSize) { - SOCKET_LOG((" Idle List size of %d met\n", mIdleCount)); - if (!GrowIdleList()) { - NS_ERROR("too many idle sockets"); - return NS_ERROR_OUT_OF_MEMORY; - } + + if (mIdleCount == NS_SOCKET_MAX_COUNT) { + NS_ERROR("too many idle sockets"); + return NS_ERROR_UNEXPECTED; } mIdleList[mIdleCount] = *sock; @@ -295,8 +270,8 @@ nsSocketTransportService::RemoveFromIdleList(SocketContext *sock) { SOCKET_LOG(("nsSocketTransportService::RemoveFromIdleList [handler=%x]\n", sock->mHandler)); - PRUint32 index = sock - mIdleList; - NS_ASSERTION(index < mIdleListSize, "invalid index in idle list"); + PRUint32 index = sock - &mIdleList[0]; + NS_ASSERTION(index < NS_SOCKET_MAX_COUNT, "invalid index"); if (index != mIdleCount-1) mIdleList[index] = mIdleList[mIdleCount-1]; @@ -310,7 +285,7 @@ nsSocketTransportService::MoveToIdleList(SocketContext *sock) { nsresult rv = AddToIdleList(sock); if (NS_FAILED(rv)) - DetachSocket(mActiveList, sock); + DetachSocket(sock); else RemoveFromPollList(sock); } @@ -320,43 +295,11 @@ nsSocketTransportService::MoveToPollList(SocketContext *sock) { nsresult rv = AddToPollList(sock); if (NS_FAILED(rv)) - DetachSocket(mIdleList, sock); + DetachSocket(sock); else RemoveFromIdleList(sock); } -PRBool -nsSocketTransportService::GrowActiveList() -{ - PRInt32 toAdd = gMaxCount - mActiveListSize; - if (toAdd > 100) - toAdd = 100; - if (toAdd < 1) - return PR_FALSE; - - mActiveListSize += toAdd; - mActiveList = (SocketContext *) - moz_xrealloc(mActiveList, sizeof(SocketContext) * mActiveListSize); - mPollList = (PRPollDesc *) - moz_xrealloc(mPollList, sizeof(PRPollDesc) * (mActiveListSize + 1)); - return PR_TRUE; -} - -PRBool -nsSocketTransportService::GrowIdleList() -{ - PRInt32 toAdd = gMaxCount - mIdleListSize; - if (toAdd > 100) - toAdd = 100; - if (toAdd < 1) - return PR_FALSE; - - mIdleListSize += toAdd; - mIdleList = (SocketContext *) - moz_xrealloc(mIdleList, sizeof(SocketContext) * mIdleListSize); - return PR_TRUE; -} - PRIntervalTime nsSocketTransportService::PollTimeout() { @@ -651,9 +594,9 @@ nsSocketTransportService::Run() // detach any sockets PRInt32 i; for (i=mActiveCount-1; i>=0; --i) - DetachSocket(mActiveList, &mActiveList[i]); + DetachSocket(&mActiveList[i]); for (i=mIdleCount-1; i>=0; --i) - DetachSocket(mIdleList, &mIdleList[i]); + DetachSocket(&mIdleList[i]); // Final pass over the event queue. This makes sure that events posted by // socket detach handlers get processed. @@ -692,7 +635,7 @@ nsSocketTransportService::DoPollIteration(PRBool wait) mActiveList[i].mHandler->mPollFlags)); //--- if (NS_FAILED(mActiveList[i].mHandler->mCondition)) - DetachSocket(mActiveList, &mActiveList[i]); + DetachSocket(&mActiveList[i]); else { PRUint16 in_flags = mActiveList[i].mHandler->mPollFlags; if (in_flags == 0) @@ -712,7 +655,7 @@ nsSocketTransportService::DoPollIteration(PRBool wait) mIdleList[i].mHandler->mPollFlags)); //--- if (NS_FAILED(mIdleList[i].mHandler->mCondition)) - DetachSocket(mIdleList, &mIdleList[i]); + DetachSocket(&mIdleList[i]); else if (mIdleList[i].mHandler->mPollFlags != 0) MoveToPollList(&mIdleList[i]); } @@ -759,7 +702,7 @@ nsSocketTransportService::DoPollIteration(PRBool wait) // for (i=mActiveCount-1; i>=0; --i) { if (NS_FAILED(mActiveList[i].mHandler->mCondition)) - DetachSocket(mActiveList, &mActiveList[i]); + DetachSocket(&mActiveList[i]); } if (n != 0 && mPollList[0].out_flags == PR_POLL_READ) { @@ -828,66 +771,3 @@ nsSocketTransportService::GetSendBufferSize(PRInt32 *value) } -/// ugly OS specific includes are placed at the bottom of the src for clarity - -#if defined(XP_WIN) -#include -#elif defined(XP_UNIX) && !defined(AIX) && !defined(NEXTSTEP) && !defined(QNX) -#include -#endif - -PRStatus -nsSocketTransportService::DiscoverMaxCount() -{ - gMaxCount = SOCKET_LIMIT_MIN; - -#if defined(XP_UNIX) && !defined(AIX) && !defined(NEXTSTEP) && !defined(QNX) - // On unix and os x network sockets and file - // descriptors are the same. OS X comes defaulted at 256, - // most linux at 1000. We can reliably use [sg]rlimit to - // query that and raise it. We will try to raise it 250 past - // our target number of SOCKET_LIMIT_TARGET so that some descriptors - // are still available for other things. - - struct rlimit rlimitData; - if (getrlimit(RLIMIT_NOFILE, &rlimitData) == -1) - return PR_SUCCESS; - if (rlimitData.rlim_cur >= SOCKET_LIMIT_TARGET + 250) { - gMaxCount = SOCKET_LIMIT_TARGET; - return PR_SUCCESS; - } - - PRInt32 maxallowed = rlimitData.rlim_max; - if (maxallowed == -1) { /* no limit */ - maxallowed = SOCKET_LIMIT_TARGET + 250; - } else if ((PRUint32)maxallowed < SOCKET_LIMIT_MIN + 250) { - return PR_SUCCESS; - } else if ((PRUint32)maxallowed > SOCKET_LIMIT_TARGET + 250) { - maxallowed = SOCKET_LIMIT_TARGET + 250; - } - - rlimitData.rlim_cur = maxallowed; - setrlimit(RLIMIT_NOFILE, &rlimitData); - if (getrlimit(RLIMIT_NOFILE, &rlimitData) != -1) - if (rlimitData.rlim_cur > SOCKET_LIMIT_MIN + 250) - gMaxCount = rlimitData.rlim_cur - 250; - -#elif defined(XP_WIN) && !defined(WIN_CE) - // win 95, 98, etc had a limit of 100 - so we will just - // use the historical 50 in every case older than XP (0x501). - // >= XP is confirmed to have at least 1000 - - OSVERSIONINFO osInfo = { sizeof(OSVERSIONINFO) }; - if (GetVersionEx(&osInfo)) { - PRInt32 version = - (osInfo.dwMajorVersion & 0xff) << 8 | - (osInfo.dwMinorVersion & 0xff); - if (version >= 0x501) /* xp or later */ - gMaxCount = SOCKET_LIMIT_TARGET; - } -#else - // other platforms are harder to test - so leave at safe legacy value -#endif - - return PR_SUCCESS; -} diff --git a/netwerk/base/src/nsSocketTransportService2.h b/netwerk/base/src/nsSocketTransportService2.h index 510de5b4edfe..3468fb901017 100644 --- a/netwerk/base/src/nsSocketTransportService2.h +++ b/netwerk/base/src/nsSocketTransportService2.h @@ -65,6 +65,7 @@ extern PRLogModuleInfo *gSocketTransportLog; //----------------------------------------------------------------------------- +#define NS_SOCKET_MAX_COUNT 50 #define NS_SOCKET_POLL_TIMEOUT PR_INTERVAL_NO_TIMEOUT //----------------------------------------------------------------------------- @@ -88,12 +89,6 @@ public: nsSocketTransportService(); - // Max Socket count may need to get initialized/used by nsHttpHandler - // before this class is initialized. - static PRUint32 gMaxCount; - static PRCallOnceType gMaxCountInitOnce; - static PRStatus DiscoverMaxCount(); - // // the number of sockets that can be attached at any given time is // limited. this is done because some operating systems (e.g., Win9x) @@ -102,7 +97,7 @@ public: // call CanAttachSocket and check the result before creating a socket. // PRBool CanAttachSocket() { - return mActiveCount + mIdleCount < gMaxCount; + return mActiveCount + mIdleCount < NS_SOCKET_MAX_COUNT; } protected: @@ -158,25 +153,19 @@ private: PRUint16 mElapsedTime; // time elapsed w/o activity }; - SocketContext *mActiveList; /* mListSize entries */ - SocketContext *mIdleList; /* mListSize entries */ + SocketContext mActiveList [ NS_SOCKET_MAX_COUNT ]; + SocketContext mIdleList [ NS_SOCKET_MAX_COUNT ]; - PRUint32 mActiveListSize; - PRUint32 mIdleListSize; PRUint32 mActiveCount; PRUint32 mIdleCount; - nsresult DetachSocket(SocketContext *, SocketContext *); + nsresult DetachSocket(SocketContext *); nsresult AddToIdleList(SocketContext *); nsresult AddToPollList(SocketContext *); void RemoveFromIdleList(SocketContext *); void RemoveFromPollList(SocketContext *); void MoveToIdleList(SocketContext *sock); void MoveToPollList(SocketContext *sock); - - PRBool GrowActiveList(); - PRBool GrowIdleList(); - void InitMaxCount(); //------------------------------------------------------------------------- // poll list (socket thread only) @@ -185,7 +174,7 @@ private: // event cannot be created). //------------------------------------------------------------------------- - PRPollDesc *mPollList; /* mListSize + 1 entries */ + PRPollDesc mPollList[ NS_SOCKET_MAX_COUNT + 1 ]; PRIntervalTime PollTimeout(); // computes ideal poll timeout nsresult DoPollIteration(PRBool wait); diff --git a/netwerk/protocol/http/nsHttpHandler.cpp b/netwerk/protocol/http/nsHttpHandler.cpp index baf2e99ca504..2f31f96814f2 100644 --- a/netwerk/protocol/http/nsHttpHandler.cpp +++ b/netwerk/protocol/http/nsHttpHandler.cpp @@ -844,11 +844,7 @@ nsHttpHandler::PrefsChanged(nsIPrefBranch *prefs, const char *pref) if (PREF_CHANGED(HTTP_PREF("max-connections"))) { rv = prefs->GetIntPref(HTTP_PREF("max-connections"), &val); if (NS_SUCCEEDED(rv)) { - PR_CallOnce(&nsSocketTransportService::gMaxCountInitOnce, - nsSocketTransportService::DiscoverMaxCount); - mMaxConnections = - (PRUint16) NS_CLAMP((PRUint32)val, 1, - nsSocketTransportService::gMaxCount); + mMaxConnections = (PRUint16) NS_CLAMP(val, 1, NS_SOCKET_MAX_COUNT); if (mConnMgr) mConnMgr->UpdateParam(nsHttpConnectionMgr::MAX_CONNECTIONS, mMaxConnections);