Merge branch 'DRTVWR-521-maint' of https://bitbucket.org/lindenlab/viewer

master
Ansariel 2021-06-08 19:55:43 +02:00
commit 826ee26272
38 changed files with 304 additions and 153 deletions

View File

@ -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>

View File

@ -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.

View File

@ -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) */

View File

@ -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

View File

@ -56,7 +56,6 @@ void HttpReplyQueue::addOp(const HttpReplyQueue::opPtr_t &op)
mQueue.push_back(op);
}
mQueueCV.notify_all();
}

View File

@ -98,7 +98,6 @@ protected:
OpContainer mQueue;
LLCoreInt::HttpMutex mQueueMutex;
LLCoreInt::HttpConditionVariable mQueueCV;
}; // end class HttpReplyQueue

View File

@ -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;
}
}

View File

@ -124,7 +124,7 @@ public:
/// them on their way.
///
/// Threading: callable by any thread.
void stopQueue();
bool stopQueue();
protected:
static HttpRequestQueue * sInstance;

View File

@ -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)

View File

@ -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()
{

View File

@ -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();

View File

@ -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

View File

@ -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)

View File

@ -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;
};

View File

@ -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).

View File

@ -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

View File

@ -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; };

View File

@ -33,6 +33,7 @@
LLNonInlineTextView *inputView;
NSTimer *frameTimer;
NSString *currentInputLanguage;
std::string secondLogPath;
}
@property (assign) IBOutlet LLNSWindow *window;

View File

@ -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

View File

@ -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;
}

View File

@ -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()

View File

@ -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();

View File

@ -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;
}
}
}
}
}
}

View File

@ -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(

View File

@ -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!

View File

@ -113,7 +113,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
}
}
if(!LLApp::isQuitting())
if(!LLApp::isExiting())
{
LLNotificationsUtil::add(ent.mNotifyName, args);
}

View File

@ -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);
}

View File

@ -51,7 +51,7 @@ public:
private:
boost::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
std::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
};

View File

@ -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);

View File

@ -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())
{

View File

@ -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());
}
//--------------------------------------------------------------------------

View File

@ -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;
};

View File

@ -1114,7 +1114,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
}
if (mGalleryCreated && !LLApp::isQuitting())
if (mGalleryCreated && !LLApp::isExiting())
{
reArrangeRows();
}

View File

@ -450,7 +450,7 @@ void LLToolMgr::clearTransientTool()
void LLToolMgr::onAppFocusLost()
{
if (LLApp::isQuitting())
if (LLApp::isExiting())
return;
if (mSelectedTool)

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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);