summaryrefslogtreecommitdiff
path: root/indra/llmessage/llpumpio.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmessage/llpumpio.cpp')
-rw-r--r--indra/llmessage/llpumpio.cpp88
1 files changed, 58 insertions, 30 deletions
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index b87b66822c..a8d2a0a224 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -4,30 +4,25 @@
* @date 2004-11-21
* @brief Implementation of the i/o pump and related functions.
*
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2007, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlife.com/developers/opensource/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlife.com/developers/opensource/flossexception
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -36,11 +31,12 @@
#include <map>
#include <set>
-#include "apr-1/apr_poll.h"
+#include "apr_poll.h"
#include "llapr.h"
#include "llmemtype.h"
#include "llstl.h"
+#include "llstat.h"
// These should not be enabled in production, but they can be
// intensely useful during development for finding certain kinds of
@@ -49,7 +45,7 @@
//#define LL_DEBUG_PIPE_TYPE_IN_PUMP 1
//#define LL_DEBUG_POLL_FILE_DESCRIPTORS 1
#if LL_DEBUG_POLL_FILE_DESCRIPTORS
-#include "apr-1/apr_portable.h"
+#include "apr_portable.h"
#endif
#endif
@@ -176,8 +172,11 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
mCurrentPool(NULL),
mCurrentPoolReallocCount(0),
mChainsMutex(NULL),
- mCallbackMutex(NULL)
+ mCallbackMutex(NULL),
+ mCurrentChain(mRunningChains.end())
{
+ mCurrentChain = mRunningChains.end();
+
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
initialize(pool);
}
@@ -261,7 +260,7 @@ bool LLPumpIO::addChain(
bool LLPumpIO::setTimeoutSeconds(F32 timeout)
{
// If no chain is running, return failure.
- if(current_chain_t() == mCurrentChain)
+ if(mRunningChains.end() == mCurrentChain)
{
return false;
}
@@ -269,6 +268,15 @@ bool LLPumpIO::setTimeoutSeconds(F32 timeout)
return true;
}
+void LLPumpIO::adjustTimeoutSeconds(F32 delta)
+{
+ // Ensure a chain is running
+ if(mRunningChains.end() != mCurrentChain)
+ {
+ (*mCurrentChain).adjustTimeoutSeconds(delta);
+ }
+}
+
static std::string events_2_string(apr_int16_t events)
{
std::ostringstream ostr;
@@ -365,7 +373,7 @@ S32 LLPumpIO::setLock()
// lock the runner at the same time.
// If no chain is running, return failure.
- if(current_chain_t() == mCurrentChain)
+ if(mRunningChains.end() == mCurrentChain)
{
return 0;
}
@@ -414,7 +422,7 @@ bool LLPumpIO::sleepChain(F64 seconds)
bool LLPumpIO::copyCurrentLinkInfo(links_t& links) const
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
- if(current_chain_t() == mCurrentChain)
+ if(mRunningChains.end() == mCurrentChain)
{
return false;
}
@@ -430,11 +438,13 @@ void LLPumpIO::pump()
pump(DEFAULT_POLL_TIMEOUT);
}
+static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO");
+
//timeout is in microseconds
void LLPumpIO::pump(const S32& poll_timeout)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
- LLFastTimer t1(LLFastTimer::FTM_PUMP);
+ LLFastTimer t1(FTM_PUMP_IO);
//llinfos << "LLPumpIO::pump()" << llendl;
// Run any pending runners.
@@ -514,7 +524,10 @@ void LLPumpIO::pump(const S32& poll_timeout)
//llinfos << "polling" << llendl;
S32 count = 0;
S32 client_id = 0;
- apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
+ {
+ LLPerfBlock polltime("pump_poll");
+ apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
+ }
PUMP_DEBUG;
for(S32 ii = 0; ii < count; ++ii)
{
@@ -533,7 +546,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
//lldebugs << "Running chain count: " << mRunningChains.size() << llendl;
running_chains_t::iterator run_chain = mRunningChains.begin();
bool process_this_chain = false;
- for(; run_chain != mRunningChains.end(); )
+ while( run_chain != mRunningChains.end() )
{
PUMP_DEBUG;
if((*run_chain).mInit
@@ -584,6 +597,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
}
PUMP_DEBUG;
mCurrentChain = run_chain;
+
if((*run_chain).mDescriptors.empty())
{
// if there are no conditionals, just process this chain.
@@ -702,7 +716,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
PUMP_DEBUG;
// null out the chain
- mCurrentChain = current_chain_t();
+ mCurrentChain = mRunningChains.end();
END_PUMP_DEBUG;
}
@@ -758,6 +772,8 @@ bool LLPumpIO::respond(
return true;
}
+static LLFastTimer::DeclareTimer FTM_PUMP_CALLBACK_CHAIN("Chain");
+
void LLPumpIO::callback()
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
@@ -779,6 +795,7 @@ void LLPumpIO::callback()
callbacks_t::iterator end = mCallbacks.end();
for(; it != end; ++it)
{
+ LLFastTimer t(FTM_PUMP_CALLBACK_CHAIN);
// it's always the first and last time for respone chains
(*it).mHead = (*it).mChainLinks.begin();
(*it).mInit = true;
@@ -1160,3 +1177,14 @@ void LLPumpIO::LLChainInfo::setTimeoutSeconds(F32 timeout)
mTimer.stop();
}
}
+
+void LLPumpIO::LLChainInfo::adjustTimeoutSeconds(F32 delta)
+{
+ LLMemType m1(LLMemType::MTYPE_IO_PUMP);
+ if(mTimer.getStarted())
+ {
+ F64 expiry = mTimer.expiresAt();
+ expiry += delta;
+ mTimer.setExpiryAt(expiry);
+ }
+}