Commit Graph

44267 Commits (8ea7867528cf2c03f2fc60a361663af2a4084bfb)

Author SHA1 Message Date
Nat Goodspeed b3708ac238 SL-15200: Use new LLApp::sleep() in LLPurgeDiskCacheThread::run(). 2021-05-17 15:10:06 -04:00
Nat Goodspeed d313d7021f SL-15200: Add LLApp::sleep(duration) methods.
Two sleep() methods: one accepting F32Milliseconds, or in general any LLUnits
time class; the other accepting any std::chrono::duration.

The significant thing about each of these sleep() methods, as opposed to any
freestanding sleep() function, is that it only sleeps until the app starts
shutdown. Moreover, it returns true if it slept for the whole specified
duration, false if it woke for app shutdown.

This is accomplished by making LLApp::sStatus be an LLScalarCond<EAppStatus>
instead of a plain EAppStatus enum, and by making setStatus() call set_all()
each time the value changes. Then each new sleep() method can call
wait_for_unequal(duration, APP_STATUS_RUNNING).

Introducing llcond.h into llapp.h triggered an #include circularity because
llthread.h #included llapp.h even though it didn't reference anything from it.
Removed. This, in turn, necessitated adding #include "llapp.h" to several .cpp
files that reference LLApp but had been depending on other header files to
drag in llapp.h.
2021-05-17 13:37:13 -04:00
Nat Goodspeed 87faf25891 SL-15200: Explain why purge() is called on another thread.
Also add Ansariel's explanation for why interaction through the filesystem
itself should be safe.
2021-05-17 10:24:27 -04:00
Ansariel 89cf988aaf BUG-230673: Add warning that LLDiskCache::purge() is also called from outside the main thread 2021-05-17 09:49:32 +02:00
Callum Prentice c705126d0b Fixes SL-14897 Disable Flash support in the embedded browser 2021-05-14 15:21:06 -07:00
Nat Goodspeed 1eeb4c85a1 SL-15258: No 'using namespace std' with Windows SDK
With /std:c++17, in wbemcli.h included by <Wbemidl.h>, we were getting errors
concerning an ambiguous symbol 'byte'. This turns out to be due to a 'using
namespace std' declaration before the #include. The linked workaround advises
moving 'using namespace std' after the #include. But since the ONLY symbol
from std that was used without qualification was 'hex' in a few places, remove
'using namespace std' altogether and just write 'std::hex' everywhere.

https://developercommunity.visualstudio.com/t/error-c2872-byte-ambiguous-symbol/93889#T-N138537
2021-05-14 10:36:29 -04:00
Nat Goodspeed d3d8203be4 SL-15258: Remove additional std library features dropped with C++17. 2021-05-13 22:10:43 -04:00
Andrey Lihatskiy a442f8b451 Revert "Merge branch 'DRTVWR-531' into DRTVWR-516-maint"
This reverts commit 07456abe92, reversing
changes made to 8a33636e8f.
2021-05-13 20:29:01 +03:00
Nat Goodspeed f7f6553cac Merge branch 'c++17' of ssh://bitbucket.org/lindenlab/viewer into c++17 2021-05-13 12:47:24 -04:00
Nat Goodspeed b4817ef394 SL-15258: Update to colladadom without auto_ptr 2021-05-13 12:46:10 -04:00
Nat Goodspeed 060194a9f8 SL-10297: Need VS switch /std:c++17 to use std::string_view.
(cherry picked from commit 28deadab5b)
2021-05-13 11:40:05 -04:00
Nat Goodspeed 24501dfa0e SL-10297: Use initializer_list<std::string> vs. <std::string_view>.
This is somewhat more expensive for string literals, but switching to
std::string_view implies more extensive changes, to be considered separately.
2021-05-12 22:35:09 -04:00
Nat Goodspeed a58eea7419 SL-10297: Revert "Need VS switch /std:c++17 to use std::string_view."
This reverts commit 28deadab5b.

Going there implies other changes, will take up on another branch.
2021-05-12 22:30:34 -04:00
Andrey Lihatskiy 9626649f90 Merge branch 'DRTVWR-533' into DRTVWR-516-maint 2021-05-13 00:51:28 +03:00
Nat Goodspeed 28deadab5b SL-10297: Need VS switch /std:c++17 to use std::string_view. 2021-05-12 17:08:15 -04:00
Nat Goodspeed d10badf0d2 SL-10297: #include <string_view> in llsingleton.h 2021-05-12 16:26:53 -04:00
Nat Goodspeed 28862ab53b SL-10297: Clean up a few merge glitches. 2021-05-12 14:21:27 -04:00
Nat Goodspeed fd1545197a SL-10297: Merge branch 'sl-10297-oz' into sl-10297.
Bring in Oz's tweaks to the way BugSplat is engaged and tested, plus a few
other miscellaneous goodies.
2021-05-12 13:56:19 -04:00
Nat Goodspeed 91c20363ee SL-10297: Get rid of LLError::LLCallStacks::allocateStackBuffer().
Also freeStackBuffer() and all the funky classic-C string management of a big
flat buffer divided into exactly 512 128-byte strings. Define StringVector as
a std::vector<std::string>, and use that instead.

Retain the behavior of clearing the vector if it exceeds 512 entries.

This eliminates the LLError::Log::flush(const std::ostringstream&, char*)
overload as well, with its baffling mix of std::string and classic-C (e.g.
strlen(out.str().c_str()).

If we absolutely MUST use a big memory pool for performance reasons, let's
use StringVector with allocators.
2021-05-12 13:37:24 -04:00
Andrey Kleshchev 3917de54db SL-15245 Multiple guide books open, but cannot close them all
Opening and closing single-instance floaters rapidly and multiple times could result in cleaning instance from floaterreg twice, thus removing new isntance instead of current one
2021-05-12 20:25:04 +03:00
Nat Goodspeed 5b96ee0e10 SL-10297: Eliminate llerror.cpp's Globals::messageStream and bool.
Instead of a single std::ostringstream instance shared by all callers, even
those on different threads, make each of the relevant lllog_test_() and
llcallstacks macros instantiate independent (stack) std::ostringstream
objects. lllog_test_() is called by LL_DEBUGS(), LLINFOS(), LL_WARNS(),
LL_ERRS(), LL_VLOGS() et al.

Eliminate LLError::Log::out(), whose sole function was to arbitrate use of
that shared std::ostringstream. Amusingly, if the lock couldn't be locked or
if messageStreamInUse was set, out() would allocate a new (heap!)
std::ostringstream anyway, which would then have to be freed by flush().

Make both LLError::Log::flush() overloads accept const std::ostringstream&.
Make LL_ENDL pass the local _out instance. This eliminates the need to check
whether the passed std::ostringstream* references the shared instance and
(if so) reset it or (if not) delete it.

Make LLError::LLCallStacks::insert() accept the local _out instance as non-
const std::ostream&, rather than acquiring and returning std::ostringstream*.
Make end() accept the local instance as const std::ostringstream&.
2021-05-12 12:02:57 -04:00
Nat Goodspeed 147c66d67c SL-10297: Simplify implementation of LLSingletonBase::logwarns() etc.
Introduce 'string_params' typedef for std::initialization_list<std::string>,
and make logwarns(), loginfos(), logdebugs() and logerrs() accept const
string_params&.

Eliminate the central log() function in llsingleton.cpp that used LL_VLOGS().
To cache the result of a (moderately expensive) Log::shouldLog() call,
LL_VLOGS() wants its CallSite object to be static -- but of course the
shouldLog() result will differ for different ELevel values, so LL_VLOGS()
instantiates a static array of CallSite instances. It seems silly to funnel
distinct logwarns(), etc., functions through a common log() function only to
have LL_VLOGS() tease apart ELevel values again. Instead, make logwarns()
directly invoke LL_WARNS(), and similarly for the rest.

To reduce boilerplate in these distinct functions, teach std::ostream how to
stream a string_params instance by looping over its elements. Then each
logwarns(), etc., function can simply stream its string_params argument to
LL_WARNS() or whichever.

In particular, eliminate the LLERROR_CRASH macro in logerrs(). The fact that
it invokes LL_ERRS() ensures that its LL_ENDL macro will crash the viewer.
2021-05-12 09:46:49 -04:00
Ansariel 0e253cb909 BUG-230673: Trim asset disk cache regularly 2021-05-12 10:45:23 +02:00
Nat Goodspeed c9fc4349b7 SL-10297: Move LL_ERRS crash location into the LL_ERRS macro itself.
Introduce Oz's LLERROR_CRASH macro analogous to the old LLError::crashAndLoop()
function. Change LL_ENDL macro so that, after calling flush(), if the CallSite
is for LEVEL_ERROR, we invoke LLERROR_CRASH right there.

Change the meaning of LLError::FatalFunction. It used to be responsible for
the actual crash (hence crashAndLoop()). Now, instead, its role is to disrupt
control flow in some other way if you DON'T want to crash: throw an exception,
or call exit() or some such. Any FatalFunction that returns normally will fall
into the new crash in LL_ENDL.

Accordingly, the new default FatalFunction is a no-op lambda. This eliminates
the need to test for empty (not set) FatalFunction in Log::flush().

Remove LLError::crashAndLoop() because the official LL_ERRS crash is now in
LL_ENDL.

One of the two common use cases for setFatalFunction() used to be to intercept
control in the last moments before crashing -- not to crash or to avoid
crashing, but to capture the LL_ERRS message in some way. Especially when
that's temporary, though (e.g. LLLeap), saving and restoring the previous
FatalFunction only works when the lifespans of the relevant objects are
strictly LIFO.

Either way, that's a misuse of FatalFunction. Fortunately the Recorder
mechanism exactly addresses that case. Introduce a GenericRecorder template
subclass, with LLError::addGenericRecorder(callable) that accepts a callable
with suitable (level, message) signature, instantiates a GenericRecorder, adds
it to the logging machinery and returns the RecorderPtr for possible later use
with removeRecorder().

Change llappviewer.cpp's errorCallback() to an addGenericRecorder() callable.
Its role was simply to update gDebugInfo["FatalMessage"] with the LL_ERRS
message, then call writeDebugInfo(), before calling crashAndLoop() to finish
crashing. Remove the crashAndLoop() call, retaining the gDebugInfo logic. Pass
errorCallback() to LLError::addGenericRecorder() instead of setFatalFunction().

Oddly, errorCallback()'s crashAndLoop() call was conditional on a compile-time
SHADER_CRASH_NONFATAL symbol. The new mechanism provides no way to support
SHADER_CRASH_NONFATAL -- it is a Bad Idea to return normally from any LL_ERRS
invocation!

Rename LLLeapImpl::fatalFunction() to onError(). Instead of passing it to
LLError::setFatalFunction(), pass it to addGenericRecorder(). Capture the
returned RecorderPtr in mRecorder, replacing mPrevFatalFunction. Then
~LLLeapImpl() calls removeRecorder(mRecorder) instead of restoring
mPrevFatalFunction (which, as noted above, was order-sensitive).

Of course, every enabled Recorder is called with every log message. onError()
and errorCallback() must specifically test for calls with LEVEL_ERROR.

LLSingletonBase::logerrs() used to call LLError::getFatalFunction(), check the
return and call it if non-empty, else call LLError::crashAndLoop(). Replace
all that with LLERROR_CRASH.

Remove from llappviewer.cpp the watchdog_llerrs_callback() and
watchdog_killer_callback() functions. watchdog_killer_callback(), passed to
Watchdog::init(), used to setFatalFunction(watchdog_llerrs_callback) and then
invoke LL_ERRS() -- which seems a bit roundabout. watchdog_llerrs_callback(),
in turn, replicated much of the logic in the primary errorCallback() function
before replicating the crash from llwatchdog.cpp's default_killer_callback().

Instead, pass LLWatchdog::init() a lambda that invokes the LL_ERRS() message
formerly found in watchdog_killer_callback(). It no longer needs to override
FatalFunction with watchdog_llerrs_callback() because errorCallback() will
still be called as a Recorder, obviating watchdog_llerrs_callback()'s first
half; and LL_ENDL will handle the crash, obviating the second half.

Remove from llappviewer.cpp the static fast_exit() function, which was simply
an alias for _exit() acceptable to boost::bind(). Use a lambda directly
calling _exit() instead of using boost::bind() at all.

In the CaptureLog class in llcommon/tests/wrapllerrs.h, instead of statically
referencing the wouldHaveCrashed() function from test.cpp, simply save and
restore the current FatalFunction across the LLError::saveAndResetSettings()
call.

llerror_test.cpp calls setFatalFunction(fatalCall), where fatalCall() was a
function that simply set a fatalWasCalled bool rather than actually crashing
in any way. Of course, that implementation would now lead to crashing the test
program. Make fatalCall() throw a new FatalWasCalled exception. Introduce a
CATCH(LL_ERRS("tag"), "message") macro that expands to:
LL_ERRS("tag") << "message" << LL_ENDL;
within a try/catch block that catches FatalWasCalled and sets the same bool.

Change all existing LL_ERRS() in llerror_test.cpp to corresponding CATCH()
calls. In fact there's also an LL_DEBUGS(bad tag) invocation that exercises an
LL_ERRS internal to llerror.cpp; wrap that too.
2021-05-11 21:42:14 -04:00
Andrey Kleshchev 87f1d6071e SL-15168 Added 'Title' argument 2021-05-12 00:41:14 +03:00
Andrey Kleshchev 8eede89c0f Revert "SL-15168 Changed format" 2021-05-12 00:41:14 +03:00
Callum Prentice c241c5d4b8 Merge branch 'DRTVWR-519' of https://bitbucket.org/lindenlab/viewer into DRTVWR-519 2021-05-11 12:59:37 -07:00
Ansariel Hiller 1ec6c10c14 Merged in DRTVWR-519 (pull request #567)
BUG-230697: Do not crash viewer during cache cleanup

Approved-by: Callum Linden
2021-05-11 19:59:21 +00:00
Callum Prentice 3898609ae2 Fix for SL-15226 Simple cache viewer: Integer overflow in cache size - via FS:Ansariel 2021-05-11 12:58:05 -07:00
Andrey Lihatskiy 07456abe92 Merge branch 'DRTVWR-531' into DRTVWR-516-maint 2021-05-11 21:27:58 +03:00
Ansariel 8633ba9c8b BUG-230697: Do not crash viewer during cache cleanup 2021-05-11 20:27:07 +02:00
Andrey Kleshchev a7fada58ac SL-15249 Fix MAC build issue 2021-05-11 17:12:27 +03:00
Mnikolenko Productengine e4dc39cf19 SL-15249 FIXED The F1 key does not close the guidebook after clicking a link 2021-05-11 13:25:57 +03:00
Mnikolenko Productengine 713ab594d3 Merge branch 'DRTVWR-518-ui' of https://bitbucket.org/lindenlab/viewer/commits/branch/DRTVWR-518-ui into DRTVWR-518-ui 2021-05-11 13:25:45 +03:00
Andrey Kleshchev c8c06400a6 SL-15245 Multiple guide books open, but cannot close them all
"how_to" floater is supposed to be single instance
2021-05-11 13:23:04 +03:00
Andrey Kleshchev 80eb5ae1f2 SL-15168 Improved uri recognition 2021-05-11 13:21:04 +03:00
Andrey Kleshchev 2ddbdeb165 SL-15168 Reset title of guidebook when opening 2021-05-11 13:00:45 +03:00
Andrey Kleshchev e886a5e343 SL-15168 Reset title of guidebook when opening 2021-05-11 01:48:21 +03:00
Andrey Kleshchev 9dee16185a SL-15168 Changed format
instead of an url function takes an uri
2021-05-11 01:27:10 +03:00
Andrey Kleshchev 48394bdc23 SL-15168 Reorginized contants 2021-05-11 00:10:38 +03:00
Nat Goodspeed 95d8085fa4 SL-10297: Make LLSingletonBase::llerrs() et al. runtime variadic.
Instead of accepting a fixed list of (const char* p1="", etc.), accept
(std::initializer_list<std::string_view>). Accepting a
std::initializer_list<T> in your parameter list allows coding (e.g.)
func({T0, T1, T2, ... });
-- in other words, you can pass the initializer_list a brace-enclosed list of
an arbitrary number of instances of T.

Using std::string_view instead of const char* means we can pass *either* const
char* or std::string. string_view is cheaply constructed from either, allowing
uniform treatment within the function.

Constructing string_view from std::string simply extracts the pointer and
length from the std::string.

Constructing string_view from const char* (e.g. a "string literal") requires
scanning the string for its terminating nul byte -- but that would be
necessary even if the scan were deferred until the function body. Since
string_view stores the length, the scan still happens only once.
2021-05-10 15:21:51 -04:00
Andrey Kleshchev aac1fc4991 SL-15168 Mac build fix 2021-05-10 21:15:12 +03:00
Nat Goodspeed 26fb5d7af7 SL-15241: Tweak viewer sources to permit compiling on Mac with C++17. 2021-05-07 20:32:04 -04:00
Andrey Kleshchev cb42bc2823 SL-15168 Viewer side functionality for guidebook window opening #2 2021-05-06 21:57:46 +03:00
Andrey Kleshchev cfb6ca569b SL-15168 Viewer side functionality for guidebook window opening 2021-05-06 02:46:42 +03:00
Andrey Lihatskiy 9874d65e54 Follow-up merge conflict fix 2021-05-01 02:17:35 +03:00
Andrey Lihatskiy 933b98880e DRTVWR-520 Updated uriparser to codeticket build 559132 2021-05-01 02:14:54 +03:00
Andrey Lihatskiy 02405a74d2 DRTVWR-520 Post-merge build fix + error handling improvement 2021-05-01 02:05:06 +03:00
Andrey Kleshchev 8a33636e8f SL-13395 Don't hide empty outfit folders
Outfit folders can be created, managed and deleted by users, they should stay visible
2021-04-30 16:27:20 +03:00
Andrey Lihatskiy 789be6b933 Merge branch 'master' into DRTVWR-520-apple-notarization 2021-04-30 03:05:19 +03:00