aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra/newview')
-rw-r--r--linden/indra/newview/llappviewer.cpp98
-rw-r--r--linden/indra/newview/llappviewer.h10
-rw-r--r--linden/indra/newview/llfloaterbuycurrency.cpp2
-rw-r--r--linden/indra/newview/llfloaterregioninfo.cpp2
-rw-r--r--linden/indra/newview/llhoverview.cpp4
-rw-r--r--linden/indra/newview/llstartup.cpp4
-rw-r--r--linden/indra/newview/lltexturecache.cpp9
-rw-r--r--linden/indra/newview/llviewernetwork.cpp17
-rw-r--r--linden/indra/newview/llwatchdog.cpp17
-rw-r--r--linden/indra/newview/llwatchdog.h6
-rw-r--r--linden/indra/newview/llworld.cpp4
11 files changed, 134 insertions, 39 deletions
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index c6f4cdd..a461dcb 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -530,7 +530,8 @@ LLAppViewer::LLAppViewer() :
530 mSavedFinalSnapshot(false), 530 mSavedFinalSnapshot(false),
531 mQuitRequested(false), 531 mQuitRequested(false),
532 mLogoutRequestSent(false), 532 mLogoutRequestSent(false),
533 mYieldTime(-1) 533 mYieldTime(-1),
534 mMainloopTimeout(NULL)
534{ 535{
535 if(NULL != sInstance) 536 if(NULL != sInstance)
536 { 537 {
@@ -538,15 +539,16 @@ LLAppViewer::LLAppViewer() :
538 } 539 }
539 540
540 sInstance = this; 541 sInstance = this;
541
542 // Initialize the mainloop timeout.
543 mMainloopTimeout = new LLWatchdogTimeout();
544} 542}
545 543
546LLAppViewer::~LLAppViewer() 544LLAppViewer::~LLAppViewer()
547{ 545{
548 // Initialize the mainloop timeout. 546 if(mMainloopTimeout)
549 delete mMainloopTimeout; 547 {
548 // delete the mainloop timeout.
549 delete mMainloopTimeout;
550 mMainloopTimeout = NULL;
551 }
550 552
551 // If we got to this destructor somehow, the app didn't hang. 553 // If we got to this destructor somehow, the app didn't hang.
552 removeMarkerFile(); 554 removeMarkerFile();
@@ -830,10 +832,6 @@ bool LLAppViewer::init()
830 832
831bool LLAppViewer::mainLoop() 833bool LLAppViewer::mainLoop()
832{ 834{
833 mMainloopTimeout = new LLWatchdogTimeout();
834 // *FIX:Mani - Make this a setting, once new settings exist in this branch.
835 mMainloopTimeout->setTimeout(5);
836
837 //------------------------------------------- 835 //-------------------------------------------
838 // Run main loop until time to quit 836 // Run main loop until time to quit
839 //------------------------------------------- 837 //-------------------------------------------
@@ -933,6 +931,8 @@ bool LLAppViewer::mainLoop()
933 931
934 } 932 }
935 933
934 pauseMainloopTimeout();
935
936 // Sleep and run background threads 936 // Sleep and run background threads
937 { 937 {
938 LLFastTimer t2(LLFastTimer::FTM_SLEEP); 938 LLFastTimer t2(LLFastTimer::FTM_SLEEP);
@@ -1015,7 +1015,9 @@ bool LLAppViewer::mainLoop()
1015 //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering. 1015 //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering.
1016 //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering. 1016 //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering.
1017 1017
1018 mMainloopTimeout->ping(); 1018 resumeMainloopTimeout();
1019
1020 pingMainloopTimeout("Mainloop");
1019 } 1021 }
1020 1022
1021 } 1023 }
@@ -1040,7 +1042,11 @@ bool LLAppViewer::mainLoop()
1040 1042
1041 delete gServicePump; 1043 delete gServicePump;
1042 1044
1043 mMainloopTimeout->stop(); 1045 if(mMainloopTimeout)
1046 {
1047 delete mMainloopTimeout;
1048 mMainloopTimeout = NULL;
1049 }
1044 1050
1045 llinfos << "Exiting main_loop" << llendflush; 1051 llinfos << "Exiting main_loop" << llendflush;
1046 1052
@@ -1503,6 +1509,13 @@ bool LLAppViewer::initConfiguration()
1503 LLWindow::getFontListSans()); 1509 LLWindow::getFontListSans());
1504#endif 1510#endif
1505 1511
1512 //*FIX:Mani - Set default to disabling watchdog mainloop
1513 // timeout for mac and linux. There is no call stack info
1514 // on these platform to help debug.
1515#ifndef LL_WINDOWS
1516 gSavedSettings.setBOOL("WatchdogEnabled", FALSE);
1517#endif
1518
1506 // These are warnings that appear on the first experience of that condition. 1519 // These are warnings that appear on the first experience of that condition.
1507 // They are already set in the settings_default.xml file, but still need to be added to LLFirstUse 1520 // They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
1508 // for disable/reset ability 1521 // for disable/reset ability
@@ -2143,6 +2156,12 @@ void LLAppViewer::writeSystemInfo()
2143 gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB()); 2156 gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB());
2144 gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); 2157 gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
2145 2158
2159 // *FIX:Mani - move this ddown in llappviewerwin32
2160#ifdef LL_WINDOWS
2161 DWORD thread_id = GetCurrentThreadId();
2162 gDebugInfo["MainloopThreadID"] = (S32)thread_id;
2163#endif
2164
2146 // Dump some debugging info 2165 // Dump some debugging info
2147 LL_INFOS("SystemInfo") << gSecondLife 2166 LL_INFOS("SystemInfo") << gSecondLife
2148 << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH 2167 << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
@@ -2227,6 +2246,12 @@ void LLAppViewer::handleViewerCrash()
2227 gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName(); 2246 gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName();
2228 } 2247 }
2229 2248
2249 if(LLAppViewer::instance()->mMainloopTimeout)
2250 {
2251 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
2252 }
2253
2254
2230 //Write out the crash status file 2255 //Write out the crash status file
2231 //Use marker file style setup, as that's the simplest, especially since 2256 //Use marker file style setup, as that's the simplest, especially since
2232 //we're already in a crash situation 2257 //we're already in a crash situation
@@ -3397,6 +3422,8 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3397 3422
3398void LLAppViewer::idleNetwork() 3423void LLAppViewer::idleNetwork()
3399{ 3424{
3425 pingMainloopTimeout("idleNetwork");
3426
3400 gObjectList.mNumNewObjects = 0; 3427 gObjectList.mNumNewObjects = 0;
3401 S32 total_decoded = 0; 3428 S32 total_decoded = 0;
3402 3429
@@ -3582,18 +3609,49 @@ void LLAppViewer::forceErrorSoftwareException()
3582 throw; 3609 throw;
3583} 3610}
3584 3611
3585void LLAppViewer::startMainloopTimeout(F32 secs) 3612void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs)
3586{ 3613{
3587 if(secs < 0.0f) 3614 if(!mMainloopTimeout)
3588 { 3615 {
3589 secs = gSavedSettings.getF32("MainloopTimeoutDefault"); 3616 mMainloopTimeout = new LLWatchdogTimeout();
3617 resumeMainloopTimeout(state, secs);
3590 } 3618 }
3591
3592 mMainloopTimeout->setTimeout(secs);
3593 mMainloopTimeout->start();
3594} 3619}
3595 3620
3596void LLAppViewer::stopMainloopTimeout() 3621void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs)
3597{ 3622{
3598 mMainloopTimeout->stop(); 3623 if(mMainloopTimeout)
3624 {
3625 if(secs < 0.0f)
3626 {
3627 secs = gSavedSettings.getF32("MainloopTimeoutDefault");
3628 }
3629
3630 mMainloopTimeout->setTimeout(secs);
3631 mMainloopTimeout->start(state);
3632 }
3633}
3634
3635void LLAppViewer::pauseMainloopTimeout()
3636{
3637 if(mMainloopTimeout)
3638 {
3639 mMainloopTimeout->stop();
3640 }
3599} 3641}
3642
3643void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
3644{
3645 if(mMainloopTimeout)
3646 {
3647 if(secs < 0.0f)
3648 {
3649 secs = gSavedSettings.getF32("MainloopTimeoutDefault");
3650 }
3651
3652 mMainloopTimeout->setTimeout(secs);
3653 mMainloopTimeout->ping(state);
3654 }
3655}
3656
3657
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
index 160f2c8..9f9deb6 100644
--- a/linden/indra/newview/llappviewer.h
+++ b/linden/indra/newview/llappviewer.h
@@ -129,10 +129,12 @@ public:
129 std::string getSettingsFileName(const std::string& file); 129 std::string getSettingsFileName(const std::string& file);
130 130
131 // For thread debugging. 131 // For thread debugging.
132 // llstartup needs to control this. 132 // llstartup needs to control init.
133 // llworld, send_agent_pause() also controls this. 133 // llworld, send_agent_pause() also controls pause/resume.
134 void startMainloopTimeout(F32 secs = -1.0f); 134 void initMainloopTimeout(const std::string& state, F32 secs = -1.0f);
135 void stopMainloopTimeout(); 135 void pauseMainloopTimeout();
136 void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f);
137 void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);
136 138
137protected: 139protected:
138 virtual bool initWindow(); // Initialize the viewer's window. 140 virtual bool initWindow(); // Initialize the viewer's window.
diff --git a/linden/indra/newview/llfloaterbuycurrency.cpp b/linden/indra/newview/llfloaterbuycurrency.cpp
index 0381b8f..e957ba9 100644
--- a/linden/indra/newview/llfloaterbuycurrency.cpp
+++ b/linden/indra/newview/llfloaterbuycurrency.cpp
@@ -375,7 +375,7 @@ void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)
375 { 375 {
376 LLStringBase<char>::format_map_t args; 376 LLStringBase<char>::format_map_t args;
377 args["[NAME]"] = name.c_str(); 377 args["[NAME]"] = name.c_str();
378 args["[PRICE]"] = price; 378 args["[PRICE]"] = llformat("%d", price);
379 gViewerWindow->alertXml("NotEnoughCurrency", args); 379 gViewerWindow->alertXml("NotEnoughCurrency", args);
380 return; 380 return;
381 } 381 }
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp
index 7b3b8e2..90d8af9 100644
--- a/linden/indra/newview/llfloaterregioninfo.cpp
+++ b/linden/indra/newview/llfloaterregioninfo.cpp
@@ -1147,7 +1147,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
1147 { 1147 {
1148 1148
1149 LLString::format_map_t args; 1149 LLString::format_map_t args;
1150 args["[TEXTURE_NUM]"] = i+1; 1150 args["[TEXTURE_NUM]"] = llformat("%d",i+1);
1151 args["[TEXTURE_SIZE_X]"] = llformat("%d",width); 1151 args["[TEXTURE_SIZE_X]"] = llformat("%d",width);
1152 args["[TEXTURE_SIZE_Y]"] = llformat("%d",height); 1152 args["[TEXTURE_SIZE_Y]"] = llformat("%d",height);
1153 gViewerWindow->alertXml("InvalidTerrainSize", args); 1153 gViewerWindow->alertXml("InvalidTerrainSize", args);
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index 082f413..c19b361 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -414,7 +414,7 @@ void LLHoverView::updateText()
414 else if (for_sale) 414 else if (for_sale)
415 { 415 {
416 LLString::format_map_t args; 416 LLString::format_map_t args;
417 args["[AMOUNT]"] = nodep->mSaleInfo.getSalePrice(); 417 args["[AMOUNT]"] = llformat("%d", nodep->mSaleInfo.getSalePrice());
418 line.append(LLTrans::getString("TooltipForSaleL$", args)); 418 line.append(LLTrans::getString("TooltipForSaleL$", args));
419 suppressObjectHoverDisplay = FALSE; // Show tip 419 suppressObjectHoverDisplay = FALSE; // Show tip
420 } 420 }
@@ -589,7 +589,7 @@ void LLHoverView::updateText()
589 if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE)) 589 if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE))
590 { 590 {
591 LLString::format_map_t args; 591 LLString::format_map_t args;
592 args["[AMOUNT]"] = hover_parcel->getSalePrice(); 592 args["[AMOUNT]"] = llformat("%d", hover_parcel->getSalePrice());
593 line = LLTrans::getString("TooltipForSaleL$", args); 593 line = LLTrans::getString("TooltipForSaleL$", args);
594 mText.push_back(line); 594 mText.push_back(line);
595 } 595 }
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 52f4d1a..4dca600 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -1224,7 +1224,7 @@ BOOL idle_startup()
1224 sAuthUriNum++; 1224 sAuthUriNum++;
1225 std::ostringstream s; 1225 std::ostringstream s;
1226 LLString::format_map_t args; 1226 LLString::format_map_t args;
1227 args["[NUMBER]"] = sAuthUriNum + 1; 1227 args["[NUMBER]"] = llformat("%d", sAuthUriNum + 1);
1228 auth_desc = LLTrans::getString("LoginAttempt", args).c_str(); 1228 auth_desc = LLTrans::getString("LoginAttempt", args).c_str();
1229 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); 1229 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE );
1230 return do_normal_idle; 1230 return do_normal_idle;
@@ -2329,7 +2329,7 @@ BOOL idle_startup()
2329 gDebugView->mFastTimerView->setVisible(TRUE); 2329 gDebugView->mFastTimerView->setVisible(TRUE);
2330#endif 2330#endif
2331 2331
2332 LLAppViewer::instance()->startMainloopTimeout(); 2332 LLAppViewer::instance()->initMainloopTimeout("Mainloop Init");
2333 2333
2334 return do_normal_idle; 2334 return do_normal_idle;
2335 } 2335 }
diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp
index ab85b32..8240f77 100644
--- a/linden/indra/newview/lltexturecache.cpp
+++ b/linden/indra/newview/lltexturecache.cpp
@@ -39,6 +39,9 @@
39#include "lllfsthread.h" 39#include "lllfsthread.h"
40#include "llviewercontrol.h" 40#include "llviewercontrol.h"
41 41
42// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout
43#include "llappviewer.h"
44
42#define USE_LFS_READ 0 45#define USE_LFS_READ 0
43#define USE_LFS_WRITE 0 46#define USE_LFS_WRITE 0
44 47
@@ -1155,6 +1158,9 @@ void LLTextureCache::purgeTextures(bool validate)
1155 return; 1158 return;
1156 } 1159 }
1157 1160
1161 // *FIX:Mani - watchdog off.
1162 LLAppViewer::instance()->pauseMainloopTimeout();
1163
1158 LLMutexLock lock(&mHeaderMutex); 1164 LLMutexLock lock(&mHeaderMutex);
1159 1165
1160 S32 filesize = ll_apr_file_size(mTexturesDirEntriesFileName, NULL); 1166 S32 filesize = ll_apr_file_size(mTexturesDirEntriesFileName, NULL);
@@ -1275,6 +1281,9 @@ void LLTextureCache::purgeTextures(bool validate)
1275 llassert(mTexturesSizeTotal == total_size); 1281 llassert(mTexturesSizeTotal == total_size);
1276 1282
1277 delete[] entries; 1283 delete[] entries;
1284
1285 // *FIX:Mani - watchdog back on.
1286 LLAppViewer::instance()->resumeMainloopTimeout();
1278 1287
1279 LL_INFOS("TextureCache") << "TEXTURE CACHE:" 1288 LL_INFOS("TextureCache") << "TEXTURE CACHE:"
1280 << " PURGED: " << purge_count 1289 << " PURGED: " << purge_count
diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp
index 3224c00..c1de774 100644
--- a/linden/indra/newview/llviewernetwork.cpp
+++ b/linden/indra/newview/llviewernetwork.cpp
@@ -277,7 +277,22 @@ void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
277 277
278std::string LLViewerLogin::getHelperURI() const 278std::string LLViewerLogin::getHelperURI() const
279{ 279{
280 return gSavedSettings.getString("CmdLineHelperURI"); 280 std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI");
281 if (helper_uri.empty())
282 {
283 // grab URI from selected grid
284 if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
285 {
286 helper_uri = gGridInfo[mGridChoice].mHelperURI;
287 }
288
289 if (helper_uri.empty())
290 {
291 // what do we do with unnamed/miscellaneous grids?
292 // for now, operations that rely on the helper URI (currency/land purchasing) will fail
293 }
294 }
295 return helper_uri;
281} 296}
282 297
283bool LLViewerLogin::isInProductionGrid() 298bool LLViewerLogin::isInProductionGrid()
diff --git a/linden/indra/newview/llwatchdog.cpp b/linden/indra/newview/llwatchdog.cpp
index 1dd984e..d92d381 100644
--- a/linden/indra/newview/llwatchdog.cpp
+++ b/linden/indra/newview/llwatchdog.cpp
@@ -74,6 +74,7 @@ LLWatchdogEntry::LLWatchdogEntry()
74 74
75LLWatchdogEntry::~LLWatchdogEntry() 75LLWatchdogEntry::~LLWatchdogEntry()
76{ 76{
77 stop();
77} 78}
78 79
79void LLWatchdogEntry::start() 80void LLWatchdogEntry::start()
@@ -87,8 +88,11 @@ void LLWatchdogEntry::stop()
87} 88}
88 89
89// LLWatchdogTimeout 90// LLWatchdogTimeout
91const std::string UNINIT_STRING = "uninitialized";
92
90LLWatchdogTimeout::LLWatchdogTimeout() : 93LLWatchdogTimeout::LLWatchdogTimeout() :
91 mTimeout(0.0f) 94 mTimeout(0.0f),
95 mPingState(UNINIT_STRING)
92{ 96{
93} 97}
94 98
@@ -106,23 +110,28 @@ void LLWatchdogTimeout::setTimeout(F32 d)
106 mTimeout = d; 110 mTimeout = d;
107} 111}
108 112
109void LLWatchdogTimeout::start() 113void LLWatchdogTimeout::start(const std::string& state)
110{ 114{
111 // Order of operation is very impmortant here. 115 // Order of operation is very impmortant here.
112 // After LLWatchdogEntry::start() is called 116 // After LLWatchdogEntry::start() is called
113 // LLWatchdogTimeout::isAlive() will be called asynchronously. 117 // LLWatchdogTimeout::isAlive() will be called asynchronously.
114 mTimer.start(); 118 mTimer.start();
115 mTimer.setTimerExpirySec(mTimeout); 119 ping(state);
116 LLWatchdogEntry::start(); 120 LLWatchdogEntry::start();
117} 121}
122
118void LLWatchdogTimeout::stop() 123void LLWatchdogTimeout::stop()
119{ 124{
120 LLWatchdogEntry::stop(); 125 LLWatchdogEntry::stop();
121 mTimer.stop(); 126 mTimer.stop();
122} 127}
123 128
124void LLWatchdogTimeout::ping() 129void LLWatchdogTimeout::ping(const std::string& state)
125{ 130{
131 if(!state.empty())
132 {
133 mPingState = state;
134 }
126 mTimer.setTimerExpirySec(mTimeout); 135 mTimer.setTimerExpirySec(mTimeout);
127} 136}
128 137
diff --git a/linden/indra/newview/llwatchdog.h b/linden/indra/newview/llwatchdog.h
index 96388bb..c1f2b94 100644
--- a/linden/indra/newview/llwatchdog.h
+++ b/linden/indra/newview/llwatchdog.h
@@ -59,15 +59,17 @@ public:
59 virtual ~LLWatchdogTimeout(); 59 virtual ~LLWatchdogTimeout();
60 60
61 /* virtual */ bool isAlive() const; 61 /* virtual */ bool isAlive() const;
62 /* virtual */ void start(); 62 /* virtual */ void start(const std::string& state);
63 /* virtual */ void stop(); 63 /* virtual */ void stop();
64 64
65 void setTimeout(F32 d); 65 void setTimeout(F32 d);
66 void ping(); 66 void ping(const std::string& state);
67 const std::string& getState() {return mPingState; }
67 68
68private: 69private:
69 LLTimer mTimer; 70 LLTimer mTimer;
70 F32 mTimeout; 71 F32 mTimeout;
72 std::string mPingState;
71}; 73};
72 74
73class LLWatchdogTimerThread; // Defined in the cpp 75class LLWatchdogTimerThread; // Defined in the cpp
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp
index 27d7513..2c2440c 100644
--- a/linden/indra/newview/llworld.cpp
+++ b/linden/indra/newview/llworld.cpp
@@ -1117,7 +1117,7 @@ void send_agent_pause()
1117{ 1117{
1118 // *NOTE:Mani Pausing the mainloop timeout. Otherwise a long modal event may cause 1118 // *NOTE:Mani Pausing the mainloop timeout. Otherwise a long modal event may cause
1119 // the thread monitor to timeout. 1119 // the thread monitor to timeout.
1120 LLAppViewer::instance()->stopMainloopTimeout(); 1120 LLAppViewer::instance()->pauseMainloopTimeout();
1121 1121
1122 // Note: used to check for LLWorld initialization before it became a singleton. 1122 // Note: used to check for LLWorld initialization before it became a singleton.
1123 // Rather than just remove this check I'm changing it to assure that the message 1123 // Rather than just remove this check I'm changing it to assure that the message
@@ -1175,7 +1175,7 @@ void send_agent_resume()
1175 // Reset the FPS counter to avoid an invalid fps 1175 // Reset the FPS counter to avoid an invalid fps
1176 LLViewerStats::getInstance()->mFPSStat.start(); 1176 LLViewerStats::getInstance()->mFPSStat.start();
1177 1177
1178 LLAppViewer::instance()->startMainloopTimeout(); 1178 LLAppViewer::instance()->resumeMainloopTimeout();
1179} 1179}
1180 1180
1181 1181