Merge branch 'DRTVWR-521-maint' of https://bitbucket.org/lindenlab/viewer
commit
826ee26272
|
|
@ -2405,18 +2405,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>40a87f5d505a141b2ec79513a6197c35</string>
|
||||
<string>106d16623ee9a580b20777e8072a08cb</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76516/728250/llca-202102021657.555615-common-555615.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82745/775330/llca-202106010215.560271-common-560271.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>202102021657.555615</string>
|
||||
<string>202106010215.560271</string>
|
||||
</map>
|
||||
<key>llphysicsextensions_source</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include <cctype>
|
||||
// external library headers
|
||||
#include <boost/range/iterator_range.hpp>
|
||||
#include <boost/make_shared.hpp>
|
||||
#if LL_WINDOWS
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable : 4701) // compiler thinks might use uninitialized var, but no
|
||||
|
|
@ -285,7 +284,7 @@ LLEventPump::LLEventPump(const std::string& name, bool tweak):
|
|||
// Register every new instance with LLEventPumps
|
||||
mRegistry(LLEventPumps::instance().getHandle()),
|
||||
mName(mRegistry.get()->registerNew(*this, name, tweak)),
|
||||
mSignal(boost::make_shared<LLStandardSignal>()),
|
||||
mSignal(std::make_shared<LLStandardSignal>()),
|
||||
mEnabled(true)
|
||||
{}
|
||||
|
||||
|
|
@ -317,14 +316,24 @@ void LLEventPump::clear()
|
|||
{
|
||||
// Destroy the original LLStandardSignal instance, replacing it with a
|
||||
// whole new one.
|
||||
mSignal = boost::make_shared<LLStandardSignal>();
|
||||
mSignal = std::make_shared<LLStandardSignal>();
|
||||
mConnections.clear();
|
||||
}
|
||||
|
||||
void LLEventPump::reset()
|
||||
{
|
||||
mSignal.reset();
|
||||
// Resetting mSignal is supposed to disconnect everything on its own
|
||||
// But due to crash on 'reset' added explicit cleanup to get more data
|
||||
ConnectionMap::const_iterator iter = mConnections.begin();
|
||||
ConnectionMap::const_iterator end = mConnections.end();
|
||||
while (iter!=end)
|
||||
{
|
||||
iter->second.disconnect();
|
||||
iter++;
|
||||
}
|
||||
mConnections.clear();
|
||||
|
||||
mSignal.reset();
|
||||
//mDeps.clear();
|
||||
}
|
||||
|
||||
|
|
@ -543,7 +552,7 @@ bool LLEventStream::post(const LLSD& event)
|
|||
// *stack* instance of the shared_ptr, ensuring that our heap
|
||||
// LLStandardSignal object will live at least until post() returns, even
|
||||
// if 'this' gets destroyed during the call.
|
||||
boost::shared_ptr<LLStandardSignal> signal(mSignal);
|
||||
std::shared_ptr<LLStandardSignal> signal(mSignal);
|
||||
// Let caller know if any one listener handled the event. This is mostly
|
||||
// useful when using LLEventStream as a listener for an upstream
|
||||
// LLEventPump.
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@
|
|||
#endif
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/utility.hpp> // noncopyable
|
||||
#include <boost/optional/optional.hpp>
|
||||
#include <boost/visit_each.hpp>
|
||||
|
|
@ -571,7 +569,7 @@ protected:
|
|||
const NameList& before);
|
||||
|
||||
/// implement the dispatching
|
||||
boost::shared_ptr<LLStandardSignal> mSignal;
|
||||
std::shared_ptr<LLStandardSignal> mSignal;
|
||||
|
||||
/// valve open?
|
||||
bool mEnabled;
|
||||
|
|
@ -745,14 +743,4 @@ private:
|
|||
LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request,
|
||||
const std::string& replyKey="reply");
|
||||
|
||||
// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
|
||||
// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
|
||||
// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
|
||||
// specialized for boost::weak_ptr. This remedies that omission.
|
||||
namespace boost
|
||||
{
|
||||
template <typename T>
|
||||
T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
|
||||
}
|
||||
|
||||
#endif /* ! defined(LL_LLEVENTS_H) */
|
||||
|
|
|
|||
|
|
@ -358,8 +358,9 @@ void LLThread::setQuitting()
|
|||
{
|
||||
mStatus = QUITTING;
|
||||
}
|
||||
// It's only safe to remove mRunCondition if all locked threads were notified
|
||||
mRunCondition->broadcast();
|
||||
mDataLock->unlock();
|
||||
wake();
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@ void HttpReplyQueue::addOp(const HttpReplyQueue::opPtr_t &op)
|
|||
|
||||
mQueue.push_back(op);
|
||||
}
|
||||
mQueueCV.notify_all();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,6 @@ protected:
|
|||
|
||||
OpContainer mQueue;
|
||||
LLCoreInt::HttpMutex mQueueMutex;
|
||||
LLCoreInt::HttpConditionVariable mQueueCV;
|
||||
|
||||
}; // end class HttpReplyQueue
|
||||
|
||||
|
|
|
|||
|
|
@ -142,13 +142,19 @@ void HttpRequestQueue::wakeAll()
|
|||
}
|
||||
|
||||
|
||||
void HttpRequestQueue::stopQueue()
|
||||
bool HttpRequestQueue::stopQueue()
|
||||
{
|
||||
{
|
||||
HttpScopedLock lock(mQueueMutex);
|
||||
|
||||
mQueueStopped = true;
|
||||
wakeAll();
|
||||
if (!mQueueStopped)
|
||||
{
|
||||
mQueueStopped = true;
|
||||
wakeAll();
|
||||
return true;
|
||||
}
|
||||
wakeAll();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ public:
|
|||
/// them on their way.
|
||||
///
|
||||
/// Threading: callable by any thread.
|
||||
void stopQueue();
|
||||
bool stopQueue();
|
||||
|
||||
protected:
|
||||
static HttpRequestQueue * sInstance;
|
||||
|
|
|
|||
|
|
@ -87,7 +87,11 @@ HttpService::~HttpService()
|
|||
// is a bit tricky.
|
||||
if (mRequestQueue)
|
||||
{
|
||||
mRequestQueue->stopQueue();
|
||||
if (mRequestQueue->stopQueue())
|
||||
{
|
||||
// Give mRequestQueue a chance to finish
|
||||
ms_sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
if (mThread)
|
||||
|
|
|
|||
|
|
@ -953,6 +953,11 @@ std::string LLDir::getScrubbedFileName(const std::string uncleanFileName)
|
|||
return name;
|
||||
}
|
||||
|
||||
std::string LLDir::getDumpLogsDirPath(const std::string &file_name)
|
||||
{
|
||||
return gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "dump_logs", file_name);
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLDir::getForbiddenFileChars()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -218,6 +218,8 @@ class LLDir
|
|||
// random filename in common temporary directory
|
||||
std::string getTempFilename() const;
|
||||
|
||||
static std::string getDumpLogsDirPath(const std::string &file_name = "");
|
||||
|
||||
// For producing safe download file names from potentially unsafe ones
|
||||
static std::string getScrubbedFileName(const std::string uncleanFileName);
|
||||
static std::string getForbiddenFileChars();
|
||||
|
|
|
|||
|
|
@ -27,9 +27,8 @@
|
|||
|
||||
// Many classes just store a single LLNotificationPtr
|
||||
// and llnotifications.h is very large, so define this ligher header.
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
class LLNotification;
|
||||
typedef boost::shared_ptr<LLNotification> LLNotificationPtr;
|
||||
typedef std::shared_ptr<LLNotification> LLNotificationPtr;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -84,8 +84,6 @@
|
|||
#include <sstream>
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/signals2.hpp>
|
||||
#include <boost/range.hpp>
|
||||
|
|
@ -133,7 +131,7 @@ public:
|
|||
|
||||
typedef boost::function<void (const LLSD&, const LLSD&)> LLNotificationResponder;
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr;
|
||||
typedef std::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr;
|
||||
|
||||
typedef LLFunctorRegistry<LLNotificationResponder> LLNotificationFunctorRegistry;
|
||||
typedef LLFunctorRegistration<LLNotificationResponder> LLNotificationFunctorRegistration;
|
||||
|
|
@ -278,19 +276,19 @@ private:
|
|||
bool mInvertSetting;
|
||||
};
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
typedef std::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
|
||||
|
||||
struct LLNotificationTemplate;
|
||||
|
||||
// we want to keep a map of these by name, and it's best to manage them
|
||||
// with smart pointers
|
||||
typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
|
||||
typedef std::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
|
||||
|
||||
|
||||
struct LLNotificationVisibilityRule;
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
|
||||
typedef std::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
|
||||
|
||||
/**
|
||||
* @class LLNotification
|
||||
|
|
@ -306,7 +304,7 @@ typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibility
|
|||
*/
|
||||
class LLNotification :
|
||||
boost::noncopyable,
|
||||
public boost::enable_shared_from_this<LLNotification>
|
||||
public std::enable_shared_from_this<LLNotification>
|
||||
{
|
||||
LOG_CLASS(LLNotification);
|
||||
friend class LLNotifications;
|
||||
|
|
@ -762,7 +760,14 @@ public:
|
|||
: mFilter(filter),
|
||||
mItems()
|
||||
{}
|
||||
virtual ~LLNotificationChannelBase() {}
|
||||
virtual ~LLNotificationChannelBase()
|
||||
{
|
||||
// explicit cleanup for easier issue detection
|
||||
mChanged.disconnect_all_slots();
|
||||
mPassedFilter.disconnect_all_slots();
|
||||
mFailedFilter.disconnect_all_slots();
|
||||
mItems.clear();
|
||||
}
|
||||
// you can also connect to a Channel, so you can be notified of
|
||||
// changes to this channel
|
||||
LLBoundListener connectChanged(const LLEventListener& slot)
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "lleventapi.h"
|
||||
#include "llnotificationptr.h"
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
|
|
@ -61,7 +60,7 @@ private:
|
|||
static LLSD asLLSD(LLNotificationPtr);
|
||||
|
||||
class Forwarder;
|
||||
typedef std::map<std::string, boost::shared_ptr<Forwarder> > ForwarderMap;
|
||||
typedef std::map<std::string, std::shared_ptr<Forwarder> > ForwarderMap;
|
||||
ForwarderMap mForwarders;
|
||||
LLNotifications & mNotifications;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#include "llinitparam.h"
|
||||
#include "llnotifications.h"
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
typedef std::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
|
||||
// This is the class of object read from the XML file (notifications.xml,
|
||||
// from the appropriate local language directory).
|
||||
|
|
|
|||
|
|
@ -184,11 +184,51 @@ bool LLUrlEntryBase::isLinkDisabled() const
|
|||
return globally_disabled;
|
||||
}
|
||||
|
||||
bool LLUrlEntryBase::isWikiLinkCorrect(std::string url)
|
||||
bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const
|
||||
{
|
||||
LLWString label = utf8str_to_wstring(getLabelFromWikiLink(url));
|
||||
label.erase(std::remove(label.begin(), label.end(), L'\u200B'), label.end());
|
||||
return (LLUrlRegistry::instance().hasUrl(wstring_to_utf8str(label))) ? false : true;
|
||||
LLWString wlabel = utf8str_to_wstring(getLabelFromWikiLink(labeled_url));
|
||||
wlabel.erase(std::remove(wlabel.begin(), wlabel.end(), L'\u200B'), wlabel.end());
|
||||
|
||||
// Unicode URL validation, see SL-15243
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\u2024') // "One Dot Leader"
|
||||
|| (chr == L'\uFE52') // "Small Full Stop"
|
||||
|| (chr == L'\uFF0E') // "Fullwidth Full Stop"
|
||||
// Not a decomposition, but suficiently similar
|
||||
|| (chr == L'\u05C5'); // "Hebrew Mark Lower Dot"
|
||||
},
|
||||
L'\u002E'); // Dot "Full Stop"
|
||||
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\u02D0') // "Modifier Letter Colon"
|
||||
|| (chr == L'\uFF1A') // "Fullwidth Colon"
|
||||
|| (chr == L'\uFE55'); // "Small Colon"
|
||||
},
|
||||
L'\u003A'); // Colon
|
||||
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\uFF0F'); // "Fullwidth Solidus"
|
||||
},
|
||||
L'\u002F'); // Solidus
|
||||
|
||||
std::string label = wstring_to_utf8str(wlabel);
|
||||
if ((label.find(".com") != std::string::npos
|
||||
|| label.find("www.") != std::string::npos)
|
||||
&& label.find("://") == std::string::npos)
|
||||
{
|
||||
label = "http://" + label;
|
||||
}
|
||||
|
||||
return (LLUrlRegistry::instance().hasUrl(label)) ? false : true;
|
||||
}
|
||||
|
||||
std::string LLUrlEntryBase::urlToLabelWithGreyQuery(const std::string &url) const
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public:
|
|||
|
||||
bool isLinkDisabled() const;
|
||||
|
||||
bool isWikiLinkCorrect(std::string url);
|
||||
bool isWikiLinkCorrect(const std::string &url) const;
|
||||
|
||||
virtual bool isSLURLvalid(const std::string &url) const { return TRUE; };
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
LLNonInlineTextView *inputView;
|
||||
NSTimer *frameTimer;
|
||||
NSString *currentInputLanguage;
|
||||
std::string secondLogPath;
|
||||
}
|
||||
|
||||
@property (assign) IBOutlet LLNSWindow *window;
|
||||
|
|
|
|||
|
|
@ -301,6 +301,12 @@ struct AttachmentInfo
|
|||
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
|
||||
};
|
||||
|
||||
secondLogPath = metadata.secondLogFilePathname;
|
||||
if(!secondLogPath.empty())
|
||||
{
|
||||
info.push_back(AttachmentInfo(secondLogPath, "text/xml"));
|
||||
}
|
||||
|
||||
// We "happen to know" that info[0].basename is "SecondLife.old" -- due to
|
||||
// the fact that BugsplatMac only notices a crash during the viewer run
|
||||
// following the crash. Replace .old with .log to reduce confusion.
|
||||
|
|
@ -335,6 +341,12 @@ struct AttachmentInfo
|
|||
- (void)bugsplatStartupManagerDidFinishSendingCrashReport:(BugsplatStartupManager *)bugsplatStartupManager
|
||||
{
|
||||
infos("Sent crash report to BugSplat");
|
||||
|
||||
if(!secondLogPath.empty())
|
||||
{
|
||||
boost::filesystem::remove(secondLogPath);
|
||||
}
|
||||
clearDumpLogsDir();
|
||||
}
|
||||
|
||||
- (void)bugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager didFailWithError:(NSError *)error
|
||||
|
|
|
|||
|
|
@ -4101,7 +4101,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
}
|
||||
|
||||
llcoro::suspend();
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -4168,7 +4168,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
|
||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
|
||||
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -4208,7 +4208,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
|
||||
|
||||
llcoro::suspendUntilTimeout(timeout);
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -799,8 +799,6 @@ LLAppViewer::LLAppViewer()
|
|||
|
||||
gLoggedInTime.stop();
|
||||
|
||||
initLoggingAndGetLastDuration();
|
||||
|
||||
processMarkerFiles();
|
||||
//
|
||||
// OK to write stuff to logs now, we've now crash reported if necessary
|
||||
|
|
@ -1545,6 +1543,13 @@ bool LLAppViewer::init()
|
|||
// Load User's bindings
|
||||
loadKeyBindings();
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (!mSecondInstance)
|
||||
{
|
||||
gDirUtilp->deleteDirAndContents(gDirUtilp->getDumpLogsDirPath());
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -2662,78 +2667,90 @@ void errorCallback(const std::string &error_string)
|
|||
|
||||
void LLAppViewer::initLoggingAndGetLastDuration()
|
||||
{
|
||||
//
|
||||
// Set up logging defaults for the viewer
|
||||
//
|
||||
LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "")
|
||||
//
|
||||
// Set up logging defaults for the viewer
|
||||
//
|
||||
LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "")
|
||||
,gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")
|
||||
);
|
||||
LLError::setFatalFunction(errorCallback);
|
||||
//LLError::setTimeFunction(getRuntime);
|
||||
LLError::setFatalFunction(errorCallback);
|
||||
//LLError::setTimeFunction(getRuntime);
|
||||
|
||||
// <FS:Ansariel> Remove old CEF log file (defined in dullahan.h)
|
||||
LLFile::remove(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef_log.txt"));
|
||||
|
||||
// Remove the last ".old" log file.
|
||||
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
|
||||
APP_NAME + ".old");
|
||||
LLFile::remove(old_log_file);
|
||||
if (mSecondInstance)
|
||||
{
|
||||
LLFile::mkdir(gDirUtilp->getDumpLogsDirPath());
|
||||
|
||||
LLUUID uid;
|
||||
uid.generate();
|
||||
LLError::logToFile(gDirUtilp->getDumpLogsDirPath(uid.asString() + ".log"));
|
||||
}
|
||||
else
|
||||
{
|
||||
// <FS:Ansariel> Remove old CEF log file (defined in dullahan.h)
|
||||
LLFile::remove(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef_log.txt"));
|
||||
|
||||
// Get name of the log file
|
||||
std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
|
||||
APP_NAME + ".log");
|
||||
/*
|
||||
* Before touching any log files, compute the duration of the last run
|
||||
* by comparing the ctime of the previous start marker file with the ctime
|
||||
* of the last log file.
|
||||
*/
|
||||
std::string start_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, START_MARKER_FILE_NAME);
|
||||
llstat start_marker_stat;
|
||||
llstat log_file_stat;
|
||||
std::ostringstream duration_log_stream; // can't log yet, so save any message for when we can below
|
||||
int start_stat_result = LLFile::stat(start_marker_file_name, &start_marker_stat);
|
||||
int log_stat_result = LLFile::stat(log_file, &log_file_stat);
|
||||
if ( 0 == start_stat_result && 0 == log_stat_result )
|
||||
{
|
||||
int elapsed_seconds = log_file_stat.st_ctime - start_marker_stat.st_ctime;
|
||||
// only report a last run time if the last viewer was the same version
|
||||
// because this stat will be counted against this version
|
||||
if ( markerIsSameVersion(start_marker_file_name) )
|
||||
{
|
||||
gLastExecDuration = elapsed_seconds;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration_log_stream << "start marker from some other version; duration is not reported";
|
||||
gLastExecDuration = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// at least one of the LLFile::stat calls failed, so we can't compute the run time
|
||||
duration_log_stream << "duration stat failure; start: "<< start_stat_result << " log: " << log_stat_result;
|
||||
gLastExecDuration = -1; // unknown
|
||||
}
|
||||
std::string duration_log_msg(duration_log_stream.str());
|
||||
// Remove the last ".old" log file.
|
||||
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
|
||||
APP_NAME + ".log");
|
||||
LLFile::remove(old_log_file);
|
||||
|
||||
// Create a new start marker file for comparison with log file time for the next run
|
||||
LLAPRFile start_marker_file ;
|
||||
start_marker_file.open(start_marker_file_name, LL_APR_WB);
|
||||
if (start_marker_file.getFileHandle())
|
||||
{
|
||||
recordMarkerVersion(start_marker_file);
|
||||
start_marker_file.close();
|
||||
}
|
||||
// Get name of the log file
|
||||
std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
|
||||
APP_NAME + ".log");
|
||||
/*
|
||||
* Before touching any log files, compute the duration of the last run
|
||||
* by comparing the ctime of the previous start marker file with the ctime
|
||||
* of the last log file.
|
||||
*/
|
||||
std::string start_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, START_MARKER_FILE_NAME);
|
||||
llstat start_marker_stat;
|
||||
llstat log_file_stat;
|
||||
std::ostringstream duration_log_stream; // can't log yet, so save any message for when we can below
|
||||
int start_stat_result = LLFile::stat(start_marker_file_name, &start_marker_stat);
|
||||
int log_stat_result = LLFile::stat(log_file, &log_file_stat);
|
||||
if (0 == start_stat_result && 0 == log_stat_result)
|
||||
{
|
||||
int elapsed_seconds = log_file_stat.st_ctime - start_marker_stat.st_ctime;
|
||||
// only report a last run time if the last viewer was the same version
|
||||
// because this stat will be counted against this version
|
||||
if (markerIsSameVersion(start_marker_file_name))
|
||||
{
|
||||
gLastExecDuration = elapsed_seconds;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration_log_stream << "start marker from some other version; duration is not reported";
|
||||
gLastExecDuration = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// at least one of the LLFile::stat calls failed, so we can't compute the run time
|
||||
duration_log_stream << "duration stat failure; start: " << start_stat_result << " log: " << log_stat_result;
|
||||
gLastExecDuration = -1; // unknown
|
||||
}
|
||||
std::string duration_log_msg(duration_log_stream.str());
|
||||
|
||||
// Rename current log file to ".old"
|
||||
LLFile::rename(log_file, old_log_file);
|
||||
// Create a new start marker file for comparison with log file time for the next run
|
||||
LLAPRFile start_marker_file;
|
||||
start_marker_file.open(start_marker_file_name, LL_APR_WB);
|
||||
if (start_marker_file.getFileHandle())
|
||||
{
|
||||
recordMarkerVersion(start_marker_file);
|
||||
start_marker_file.close();
|
||||
}
|
||||
|
||||
// Set the log file to SecondLife.log
|
||||
LLError::logToFile(log_file);
|
||||
if (!duration_log_msg.empty())
|
||||
{
|
||||
LL_WARNS("MarkerFile") << duration_log_msg << LL_ENDL;
|
||||
}
|
||||
// Rename current log file to ".old"
|
||||
LLFile::rename(log_file, old_log_file);
|
||||
|
||||
// Set the log file to SecondLife.log
|
||||
LLError::logToFile(log_file);
|
||||
if (!duration_log_msg.empty())
|
||||
{
|
||||
LL_WARNS("MarkerFile") << duration_log_msg << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
||||
|
|
@ -4544,6 +4561,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
// - Other Crash (SecondLife.error_marker present)
|
||||
// These checks should also remove these files for the last 2 cases if they currently exist
|
||||
|
||||
std::ostringstream marker_log_stream;
|
||||
bool marker_is_same_version = true;
|
||||
// first, look for the marker created at startup and deleted on a clean exit
|
||||
mMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,MARKER_FILE_NAME);
|
||||
|
|
@ -4554,7 +4572,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
marker_is_same_version = markerIsSameVersion(mMarkerFileName);
|
||||
|
||||
// now test to see if this file is locked by a running process (try to open for write)
|
||||
LL_DEBUGS("MarkerFile") << "Checking exec marker file for lock..." << LL_ENDL;
|
||||
marker_log_stream << "Checking exec marker file for lock...";
|
||||
mMarkerFile.open(mMarkerFileName, LL_APR_WB);
|
||||
// <FS:ND> Remove LLVolatileAPRPool/apr_file_t and use FILE* instead
|
||||
//apr_file_t* fMarker = mMarkerFile.getFileHandle() ;
|
||||
|
|
@ -4562,7 +4580,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
// </FS:ND>
|
||||
if (!fMarker)
|
||||
{
|
||||
LL_INFOS("MarkerFile") << "Exec marker file open failed - assume it is locked." << LL_ENDL;
|
||||
marker_log_stream << "Exec marker file open failed - assume it is locked.";
|
||||
mSecondInstance = true; // lock means that instance is running.
|
||||
}
|
||||
else
|
||||
|
|
@ -4570,7 +4588,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
// We were able to open it, now try to lock it ourselves...
|
||||
if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS)
|
||||
{
|
||||
LL_WARNS_ONCE("MarkerFile") << "Locking exec marker failed." << LL_ENDL;
|
||||
marker_log_stream << "Locking exec marker failed.";
|
||||
mSecondInstance = true; // lost a race? be conservative
|
||||
mMarkerFile.close(); // <FS:ND/> Cannot lock the file and take ownership. Don't keep it open
|
||||
}
|
||||
|
|
@ -4578,9 +4596,13 @@ void LLAppViewer::processMarkerFiles()
|
|||
{
|
||||
// No other instances; we've locked this file now, so record our version; delete on quit.
|
||||
recordMarkerVersion(mMarkerFile);
|
||||
LL_DEBUGS("MarkerFile") << "Exec marker file existed but was not locked; rewritten." << LL_ENDL;
|
||||
marker_log_stream << "Exec marker file existed but was not locked; rewritten.";
|
||||
}
|
||||
}
|
||||
initLoggingAndGetLastDuration();
|
||||
|
||||
std::string marker_log_msg(marker_log_stream.str());
|
||||
LL_INFOS("MarkerFile") << marker_log_msg << LL_ENDL;
|
||||
|
||||
if (mSecondInstance)
|
||||
{
|
||||
|
|
@ -4600,6 +4622,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
}
|
||||
else // marker did not exist... last exec (if any) did not freeze
|
||||
{
|
||||
initLoggingAndGetLastDuration();
|
||||
// Create the marker file for this execution & lock it; it will be deleted on a clean exit
|
||||
apr_status_t s;
|
||||
s = mMarkerFile.open(mMarkerFileName, LL_APR_WB, TRUE);
|
||||
|
|
@ -4727,6 +4750,13 @@ void LLAppViewer::removeDumpDir()
|
|||
//its locking table for us.
|
||||
std::string dump_dir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");
|
||||
gDirUtilp->deleteDirAndContents(dump_dir);
|
||||
|
||||
if (mSecondInstance && !isError())
|
||||
{
|
||||
std::string log_filename = LLError::logFileName();
|
||||
LLError::logToFile("");
|
||||
LLFile::remove(log_filename);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppViewer::forceQuit()
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ bool pumpMainLoop();
|
|||
void handleQuit();
|
||||
void cleanupViewer();
|
||||
void infos(const std::string& message);
|
||||
void clearDumpLogsDir();
|
||||
|
||||
// This struct is malleable; it only serves as a way to convey a number of
|
||||
// fields from llappviewermacosx.cpp's CrashMetadata_instance() function to the
|
||||
|
|
@ -47,6 +48,7 @@ struct CrashMetadata
|
|||
std::string agentFullname;
|
||||
std::string regionName;
|
||||
std::string fatalMessage;
|
||||
std::string secondLogFilePathname;
|
||||
};
|
||||
|
||||
CrashMetadata& CrashMetadata_instance();
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
#include <fstream>
|
||||
|
||||
#include "lldir.h"
|
||||
#include "lldiriterator.h"
|
||||
#include <signal.h>
|
||||
#include <CoreAudio/CoreAudio.h> // for systemwide mute
|
||||
class LLMediaCtrl; // for LLURLDispatcher
|
||||
|
|
@ -154,6 +155,14 @@ void cleanupViewer()
|
|||
gViewerAppPtr = NULL;
|
||||
}
|
||||
|
||||
void clearDumpLogsDir()
|
||||
{
|
||||
if (!LLAppViewer::instance()->isSecondInstance())
|
||||
{
|
||||
gDirUtilp->deleteDirAndContents(gDirUtilp->getDumpLogsDirPath());
|
||||
}
|
||||
}
|
||||
|
||||
// The BugsplatMac API is structured as a number of different method
|
||||
// overrides, each returning a different piece of metadata. But since we
|
||||
// obtain such metadata by opening and parsing a file, it seems ridiculous to
|
||||
|
|
@ -199,6 +208,7 @@ CrashMetadataSingleton::CrashMetadataSingleton()
|
|||
else
|
||||
{
|
||||
LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL;
|
||||
|
||||
logFilePathname = get_metadata(info, "SLLog");
|
||||
userSettingsPathname = get_metadata(info, "SettingsFilename");
|
||||
accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename");
|
||||
|
|
@ -208,6 +218,24 @@ CrashMetadataSingleton::CrashMetadataSingleton()
|
|||
LLStringUtil::replaceChar(agentFullname, '_', ' ');
|
||||
regionName = get_metadata(info, "CurrentRegion");
|
||||
fatalMessage = get_metadata(info, "FatalMessage");
|
||||
|
||||
if (gDirUtilp->fileExists(gDirUtilp->getDumpLogsDirPath()))
|
||||
{
|
||||
LLDirIterator file_iter(gDirUtilp->getDumpLogsDirPath(), "*.log");
|
||||
std::string file_name;
|
||||
bool found = true;
|
||||
while(found)
|
||||
{
|
||||
if((found = file_iter.next(file_name)))
|
||||
{
|
||||
std::string log_filename = gDirUtilp->getDumpLogsDirPath(file_name);
|
||||
if(LLError::logFileName() != log_filename)
|
||||
{
|
||||
secondLogFilePathname = log_filename;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ namespace
|
|||
|
||||
// <FS:ND> We don't send log files
|
||||
// sBugSplatSender->sendAdditionalFile(
|
||||
// WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")));
|
||||
// WCSTR(LLError::logFileName()));
|
||||
// </FS:ND>
|
||||
|
||||
// sBugSplatSender->sendAdditionalFile(
|
||||
|
|
|
|||
|
|
@ -449,7 +449,7 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
|
|||
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
|
||||
const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
|
||||
{
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
// Reply from coroutine came on shutdown
|
||||
// We are quiting, don't start any more coroutines!
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
|
|||
}
|
||||
}
|
||||
|
||||
if(!LLApp::isQuitting())
|
||||
if(!LLApp::isExiting())
|
||||
{
|
||||
LLNotificationsUtil::add(ent.mNotifyName, args);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ namespace LLEventPolling
|
|||
namespace Details
|
||||
{
|
||||
|
||||
class LLEventPollImpl: public boost::enable_shared_from_this<LLEventPollImpl>
|
||||
class LLEventPollImpl: public std::enable_shared_from_this<LLEventPollImpl>
|
||||
{
|
||||
public:
|
||||
LLEventPollImpl(const LLHost &sender);
|
||||
|
|
@ -320,7 +320,7 @@ namespace Details
|
|||
LLEventPoll::LLEventPoll(const std::string& poll_url, const LLHost& sender):
|
||||
mImpl()
|
||||
{
|
||||
mImpl = boost::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
|
||||
mImpl = std::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
|
||||
mImpl->start(poll_url);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ public:
|
|||
|
||||
|
||||
private:
|
||||
boost::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
std::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include "lluictrl.h"
|
||||
#include "llframetimer.h"
|
||||
#include "llnotificationptr.h"
|
||||
|
||||
class LLViewBorder;
|
||||
class LLUICtrlFactory;
|
||||
|
|
@ -145,7 +146,7 @@ public:
|
|||
|
||||
void setTextureSize(S32 width, S32 height);
|
||||
|
||||
void showNotification(boost::shared_ptr<class LLNotification> notify);
|
||||
void showNotification(LLNotificationPtr notify);
|
||||
void hideNotification();
|
||||
|
||||
void setTrustedContent(bool trusted);
|
||||
|
|
|
|||
|
|
@ -905,7 +905,7 @@ void LLMeshRepoThread::run()
|
|||
LL_WARNS(LOG_MESH) << "Convex decomposition unable to be loaded. Expect severe problems." << LL_ENDL;
|
||||
}
|
||||
|
||||
while (!LLApp::isQuitting())
|
||||
while (!LLApp::isExiting())
|
||||
{
|
||||
// *TODO: Revise sleep/wake strategy and try to move away
|
||||
// from polling operations in this thread. We can sleep
|
||||
|
|
@ -922,7 +922,7 @@ void LLMeshRepoThread::run()
|
|||
|
||||
mSignal->wait();
|
||||
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
@ -1192,7 +1192,7 @@ void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
|
|||
|
||||
void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
|
||||
{
|
||||
if (!LLAppViewer::isQuitting())
|
||||
if (!LLAppViewer::isExiting())
|
||||
{
|
||||
loadMeshLOD(mesh_params, lod);
|
||||
}
|
||||
|
|
@ -2753,7 +2753,7 @@ void LLMeshUploadThread::doWholeModelUpload()
|
|||
LL_DEBUGS(LOG_MESH) << "POST request issued." << LL_ENDL;
|
||||
|
||||
mHttpRequest->update(0);
|
||||
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
|
||||
while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
|
||||
{
|
||||
ms_sleep(sleep_time);
|
||||
sleep_time = llmin(250U, sleep_time + sleep_time);
|
||||
|
|
@ -2802,7 +2802,7 @@ void LLMeshUploadThread::requestWholeModelFee()
|
|||
U32 sleep_time(10);
|
||||
|
||||
mHttpRequest->update(0);
|
||||
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
|
||||
while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
|
||||
{
|
||||
ms_sleep(sleep_time);
|
||||
sleep_time = llmin(250U, sleep_time + sleep_time);
|
||||
|
|
@ -3251,7 +3251,7 @@ common_exit:
|
|||
|
||||
LLMeshHeaderHandler::~LLMeshHeaderHandler()
|
||||
{
|
||||
if (!LLApp::isQuitting())
|
||||
if (!LLApp::isExiting())
|
||||
{
|
||||
if (! mProcessed)
|
||||
{
|
||||
|
|
@ -3395,7 +3395,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
|
|||
|
||||
LLMeshLODHandler::~LLMeshLODHandler()
|
||||
{
|
||||
if (! LLApp::isQuitting())
|
||||
if (! LLApp::isExiting())
|
||||
{
|
||||
if (! mProcessed)
|
||||
{
|
||||
|
|
@ -3665,7 +3665,7 @@ void LLMeshRepository::shutdown()
|
|||
mUploads[i]->discard() ; //discard the uploading requests.
|
||||
}
|
||||
|
||||
mThread->mSignal->signal();
|
||||
mThread->mSignal->broadcast();
|
||||
|
||||
while (!mThread->isStopped())
|
||||
{
|
||||
|
|
@ -4907,7 +4907,8 @@ void LLPhysicsDecomp::shutdown()
|
|||
if (mSignal)
|
||||
{
|
||||
mQuitting = true;
|
||||
mSignal->signal();
|
||||
// There is only one wait(), but just in case 'broadcast'
|
||||
mSignal->broadcast();
|
||||
|
||||
while (!isStopped())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ void LLNotificationManager::init()
|
|||
mChannels.push_back(new LLBrowserNotification());
|
||||
mChannels.push_back(new LLIMHandler());
|
||||
|
||||
mChatHandler = boost::shared_ptr<LLFloaterIMNearbyChatHandler>(new LLFloaterIMNearbyChatHandler());
|
||||
mChatHandler = std::shared_ptr<LLFloaterIMNearbyChatHandler>(new LLFloaterIMNearbyChatHandler());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -35,8 +35,6 @@
|
|||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
namespace LLNotificationsUI {
|
||||
|
||||
class LLToast;
|
||||
|
|
@ -60,10 +58,10 @@ public:
|
|||
void onChat(const LLChat& msg, const LLSD &args);
|
||||
|
||||
// <FS:Ansariel> Getter for mChatHandler
|
||||
boost::shared_ptr<class LLFloaterIMNearbyChatHandler> getChatHandler() const { return mChatHandler; }
|
||||
std::shared_ptr<class LLFloaterIMNearbyChatHandler> getChatHandler() const { return mChatHandler; }
|
||||
|
||||
private:
|
||||
boost::shared_ptr<class LLFloaterIMNearbyChatHandler> mChatHandler;
|
||||
std::shared_ptr<class LLFloaterIMNearbyChatHandler> mChatHandler;
|
||||
std::vector<LLNotificationChannelPtr> mChannels;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1114,7 +1114,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
|
|||
}
|
||||
}
|
||||
|
||||
if (mGalleryCreated && !LLApp::isQuitting())
|
||||
if (mGalleryCreated && !LLApp::isExiting())
|
||||
{
|
||||
reArrangeRows();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -450,7 +450,7 @@ void LLToolMgr::clearTransientTool()
|
|||
|
||||
void LLToolMgr::onAppFocusLost()
|
||||
{
|
||||
if (LLApp::isQuitting())
|
||||
if (LLApp::isExiting())
|
||||
return;
|
||||
|
||||
if (mSelectedTool)
|
||||
|
|
|
|||
|
|
@ -581,7 +581,7 @@ void LLViewerAssetStorage::assetRequestCoro(
|
|||
|
||||
LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts);
|
||||
|
||||
if (LLApp::isQuitting() || !gAssetStorage)
|
||||
if (LLApp::isExiting() || !gAssetStorage)
|
||||
{
|
||||
// Bail out if result arrives after shutdown has been started.
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -3680,11 +3680,22 @@ BOOL LLViewerMediaTexture::findFaces()
|
|||
for(; iter != obj_list->end(); ++iter)
|
||||
{
|
||||
LLVOVolume* obj = *iter;
|
||||
if(obj->mDrawable.isNull())
|
||||
{
|
||||
ret = FALSE;
|
||||
continue;
|
||||
}
|
||||
if (obj->isDead())
|
||||
{
|
||||
// Isn't supposed to happen, objects are supposed to detach
|
||||
// themselves on markDead()
|
||||
// If this happens, viewer is likely to crash
|
||||
llassert(0);
|
||||
LL_WARNS() << "Dead object in mMediaImplp's object list" << LL_ENDL;
|
||||
ret = FALSE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (obj->mDrawable.isNull() || obj->mDrawable->isDead())
|
||||
{
|
||||
ret = FALSE;
|
||||
continue;
|
||||
}
|
||||
|
||||
S32 face_id = -1;
|
||||
S32 num_faces = obj->mDrawable->getNumFaces();
|
||||
|
|
|
|||
|
|
@ -1425,6 +1425,11 @@ void LLVivoxVoiceClient::logoutOfVivox(bool wait)
|
|||
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(mVivoxPump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
|
||||
if (sShuttingDown)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
// Don't get confused by prior queued events -- note that it's
|
||||
// very important that mVivoxPump is an LLEventMailDrop, which
|
||||
|
|
@ -1860,7 +1865,7 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
|
||||
if (sShuttingDown)
|
||||
{
|
||||
logoutOfVivox(true);
|
||||
logoutOfVivox(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1955,9 +1960,9 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
|
||||
mIsProcessingChannels = false;
|
||||
|
||||
logoutOfVivox(true);
|
||||
logoutOfVivox(!sShuttingDown /*bool wait*/);
|
||||
|
||||
if (mRelogRequested)
|
||||
if (mRelogRequested && !sShuttingDown)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Relog Requested, restarting provisioning" << LL_ENDL;
|
||||
if (!provisionVoiceAccount())
|
||||
|
|
@ -4735,6 +4740,12 @@ bool LLVivoxVoiceClient::switchChannel(
|
|||
// The old session may now need to be deleted.
|
||||
reapSession(oldSession);
|
||||
|
||||
// If voice was on, turn it off
|
||||
if (LLVoiceClient::getInstance()->getUserPTTState())
|
||||
{
|
||||
LLVoiceClient::getInstance()->setUserPTTState(false);
|
||||
}
|
||||
|
||||
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -542,7 +542,7 @@ bool LLCrashLoggerWindows::frame()
|
|||
|
||||
MSG msg;
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0))
|
||||
while (!LLApp::isExiting() && GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
|
|
|
|||
Loading…
Reference in New Issue