summaryrefslogtreecommitdiff
path: root/indra/llcommon
AgeCommit message (Collapse)Author
2022-06-18DRTVWR-564: WIP: Add LazyEventAPI and tests. Tests don't yet pass.Nat Goodspeed
LazyEventAPI is a registrar that implicitly instantiates some particular LLEventAPI subclass on demand: that is, when LLEventPumps::obtain() tries to find an LLEventPump by the registered name. This leverages the new LLEventPumps::registerPumpFactory() machinery. Fix registerPumpFactory() to adapt the passed PumpFactory to accept TypeFactory parameters (two of which it ignores). Supplement it with unregisterPumpFactory() to support LazyEventAPI instances with lifespans shorter than the process -- which may be mostly test programs, but still a hole worth closing. Similarly, add unregisterTypeFactory(). A LazyEventAPI subclass takes over responsibility for specifying the LLEventAPI's name, desc, field, plus whatever add() calls will be needed to register the LLEventAPI's operations. This is so we can (later) enhance LLLeapListener to consult LazyEventAPI instances for not-yet-instantiated LLEventAPI metadata, as well as enumerating existing LLEventAPI instances. The trickiest part of this is capturing calls to the various LLEventDispatcher::add() overloads in such a way that, when the LLEventAPI subclass is eventually instantiated, we can replay them in the new instance. LLEventAPI acquires a new protected constructor specifically for use by a subclass registered by a companion LazyEventAPI. It accepts a const reference to LazyEventAPIParams, intended to be opaque to the LLEventAPI subclass; the subclass must declare a constructor that accepts and forwards the parameter block to the new LLEventAPI constructor. The implementation delegates to the existing LLEventAPI constructor, plus it runs deferred add() calls. LLDispatchListener now derives from LLEventStream instead of containing it as a data member. The reason is that if LLEventPumps::obtain() implicitly instantiates it, LLEventPumps's destructor will try to destroy it by deleting the LLEventPump*. If the LLEventPump returned by the factory function is a data member of an outer class, that won't work so well. But if LLDispatchListener (and by implication, LLEventAPI and any subclass) is derived from LLEventPump, then the virtual destructor will Do The Right Thing. Change LLDispatchListener to *not* allow tweaking the LLEventPump name. Since the overwhelming use case for LLDispatchListener is LLEventAPI, accepting but silently renaming an LLEventAPI subclass would ensure nobody could reach it. Change LLEventDispatcher's use of std::enable_if to control the set of add() overloads available for the intended use cases. Apparently this formulation is just as functional at the method declaration point, while avoiding the need to restate the whole enable_if expression at the method definition point. Add lazyeventapi_test.cpp to exercise.
2022-06-18DRTVWR-564: Add LL::apply(): call function, passing args from tuple.Nat Goodspeed
This anticipates C++17's std::apply(), and in fact once we detect C++17, we'll just use that. But in C++14 we must still provide our own implementation.
2022-06-15DRTVWR-564: Merge branch 'pick-eventapi' into lazy-eventpumpNat Goodspeed
to pick up generalized LLEventAPI add() methods and softer error handling.
2022-06-15DRTVWR-558: Generalize LLEventDispatcher::add() constraints.Nat Goodspeed
Instead of checking whether an add() parameter is exactly LLSD or LLSDMap, check whether it's convertible to LLSD -- which handles those cases and more. (cherry picked from commit fa168c11f64771dadc5df86d14ca2f07eba3b8ba)
2022-06-15DRTVWR-558: LLEventAPI allows all LLEventDispatcher add() overloads.Nat Goodspeed
Previously, LLEventAPI intentionally hid all but one of the many add() overloads supported by its LLEventDispatcher base class. The reason was that certain of the add() methods take an optional fourth parameter that's an LLSD::Map describing the expected parameter structure, while others take a fourth templated parameter that's an instance getter callable. This led to ambiguity, especially when passed an LLSDMap instance that's convertible to LLSD but isn't literally LLSD. At the time, it was simpler to constrain the add() methods inherited from LLEventDispatcher. But by adding new std::enable_if constraints to certain LLEventDispatcher add() methods, we've resolved the ambiguities, so LLEventAPI subclasses can now use any add() overload (as claimed on the relevant Confluence page). LLEventDispatcher comments have always loftily claimed that an instance getter callable may return either a pointer or a reference, doesn't matter. But it does when trying to pass the getter's result to boost::fusion::push_back(): a reference must be wrapped with std::ref() while a pointer cannot be. std::ref(pointer) produces errors. Introduce LLEventDispatcher::invoker:: bindable() overloads to Do The Right Thing whether passed a pointer or a reference. (cherry picked from commit 743f487c2e123171c9fc6d5b84d768f1d856d569)
2022-06-15DRTVWR-558: Change LLEventDispatcher error action (also LLEventAPI).Nat Goodspeed
Originally the LLEventAPI mechanism was primarily used for VITA testing. In that case it was okay for the viewer to crash with LL_ERRS if the test script passed a bad request. With puppetry, hopefully new LEAP scripts will be written to engage LLEventAPIs in all sorts of interesting ways. Change error handling from LL_ERRS to LL_WARNS. Furthermore, if the incoming request contains a "reply" key, send back an error response to the requester. Update lleventdispatcher_test.cpp accordingly. (cherry picked from commit de0539fcbe815ceec2041ecc9981e3adf59f2806)
2022-06-15DRTVWR-564: WIP: add LLEventPumps::registerPumpFactory()Nat Goodspeed
and registerTypeFactory(). Untested. This will support registering just-in-time LLEventAPI instances, instantiated on demand.
2022-04-18Merge branch master (D540) into DRTVWR-546Andrey Kleshchev
# Conflicts: # indra/llcommon/llsdutil.cpp # indra/newview/VIEWER_VERSION.txt # indra/newview/lldrawpoolalpha.cpp # indra/newview/lldrawpoolwater.cpp
2022-03-25SL-17077 Ensure profiling is disabled if gpu_benchmark fails. Log the ↵Dave Parks
source of the real crash for when the viewer inevitably crashes later.
2022-03-09SL-16972 Per feedback from Ansariel, only bump up max heap size on 64-bit ↵Dave Parks
builds.
2022-03-01Merge branch 'master' (DRTVWR-557) into DRTVWR-546Andrey Kleshchev
# Conflicts: # autobuild.xml # doc/contributions.txt # indra/cmake/GLOD.cmake # indra/llcommon/tests/llprocess_test.cpp # indra/newview/VIEWER_VERSION.txt # indra/newview/lldrawpoolavatar.cpp # indra/newview/llfloatermodelpreview.cpp # indra/newview/llmodelpreview.cpp # indra/newview/llviewertexturelist.cpp # indra/newview/llvovolume.cpp # indra/newview/viewer_manifest.py
2022-02-28Merge branch 'master' into DRTVWR-540-maintAndrey Lihatskiy
# Conflicts: # autobuild.xml # indra/llcommon/llsys.cpp # indra/newview/app_settings/key_bindings.xml # indra/newview/llfloatereditextdaycycle.cpp
2022-02-23SL-16815 and SL-16906 Avoid redundant bumpmap generation, add some ↵Dave Parks
assertions around ref counting and (hack) fix crash on shutdown from dangling texture reference (reduced to 1 dangling texture from several hundred, can't find the remaining reference).
2022-01-14SL-16606: Add profiler category STATSPtolemy
2022-01-14SL-16606: Add profiler category THREADPtolemy
2022-01-14SL-16606: Add profiler category STRINGPtolemy
2022-01-14SL-16606: Add profiler category STATSPtolemy
2022-01-14SL-16606: Add profiler category MEMORYPtolemy
2022-01-14SL-16606: Add profiler category LOGGINGPtolemy
2022-01-14SL-16606: Add profiler category LLSDPtolemy
2022-01-14SL-16606: Include profiler categories automaticallyPtolemy
2022-01-14SL-16606: Add categoriesPtolemy
2022-01-12SL-15997 Windows 11 detection #2Andrey Kleshchev
2022-01-12SL-15997 Windows 11 detectionAndrey Kleshchev
2022-01-10Merge branch 'DRTVWR-530-maint' into DRTVWR-553-maint-mix-JKAndrey Lihatskiy
# Conflicts: # indra/newview/app_settings/key_bindings.xml # indra/newview/llappviewer.cpp # indra/newview/llkeyconflict.cpp
2021-12-26Merge branch 'master' into DRTVWR-540-maintAndrey Lihatskiy
2021-12-16Merge branch 'SL-15742' into DRTVWR-527-maintAndrey Lihatskiy
2021-12-15DRTVWR-546 merge up to 6.5.2Dave Houlton
2021-12-15Merge branch 'master' into DRTVWR-530-maintAndrey Lihatskiy
2021-12-15Merge branch 'master' (DRTVWR-552) into DRTVWR-527-maintAndrey Kleshchev
# Conflicts: # indra/media_plugins/cef/media_plugin_cef.cpp - setOnLoadEndCallback # indra/newview/llviewerassetstorage.cpp - mAssetCoroCount
2021-12-11Merge branch 'master' into SL-15742Bennett Goble
2021-12-10SL-15742: Convert build scripts to Python 3Bennett Goble
This changeset makes it possible to build the Second Life viewer using Python 3. It is designed to be used with an equivalent Autobuild branch so that a developer can compile without needing Python 2 on their machine. Breaking change: Python 2 support ending Rather than supporting two versions of Python, including one that was discontinued at the beginning of the year, this branch focuses on pouring future effort into Python 3 only. As a result, scripts do not need to be backwards compatible. This means that build environments, be they on personal computers and on build agents, need to have a compatible interpreter. Notes - SLVersionChecker will still use Python 2 on macOS - Fixed the message template url used by template_verifier.py
2021-11-24SL-16094: Fix WorkQueue test for correct behavior of runFor().Nat Goodspeed
Turns out that one of our WorkQueue integration tests was relying on the incorrect runFor() behavior that we just fixed, so the test broke. Now that runFor() doesn't wait around for work to be posted, use an explicit wait loop instead. To support this, add LLCond::get(functor), where functor must accept a const reference to the stored data. This new get() returns whatever the functor returns, allowing a caller to peek at the stored data. Also use universal references for all remaining LLCond functor arguments.
2021-11-24DRTVWR-546, SL-16220, SL-16094: Undo previous glthread branch revert.Nat Goodspeed
Reverting a merge is sticky: it tells git you never want to see that branch again. Merging the DRTVWR-546 branch, which contained the revert, into the glthread branch undid much of the development work on that branch. To restore it we must revert the revert. This reverts commit 029b41c0419e975bbb28454538b46dc69ce5d2ba.
2021-11-24SL-16400: Make WorkQueue::runFor() and runUntil() stop when done.Nat Goodspeed
runFor(interval) and runUntil(timestamp) are intended, and documented, to run *no longer than* the specified time. Instead, the initial implementation always waited the full specified time, hoping for work to arrive. Fix that: once we clear work that's already pending, return right away.
2021-11-24SL-16094: Fix merge glitches from previous revert.Nat Goodspeed
2021-11-23SL-16094, SL-16400: Merge branch 'DRTVWR-546' into glthreadNat Goodspeed
2021-11-23SL-16400: Add ThreadPool::start() method, and call it.Nat Goodspeed
It's sometimes important to finish other initialization before launching the threads in the ThreadPool, so make that an explicit step. In particular, we were launching the LLImageGL texture thread before initializing the GL context, resulting in all gray textures.
2021-11-23Merge branch 'glthread' of ssh://bitbucket.org/lindenlab/viewer into glthreadxNat Goodspeed
2021-11-23SL-16094: Support ll_convert<std::string>(const char*)Nat Goodspeed
and correspondingly, ll_convert<std::wstring>(const wchar_t*). Now that we're using ll_convert() for single-argument stringize(arg), make sure it can efficiently handle the simple case of constructing a string from a const char pointer.
2021-11-23SL-16094: Tweak llstring mergeNat Goodspeed
2021-11-23SL-16094: Merge llstring work from SL-16207Nat Goodspeed
2021-11-23SL-16094: Extend stringize() to support variadic arguments.Nat Goodspeed
It's useful to be able to say STRINGIZE(item0 << item1 << item2), and we use that a lot in our code base. But weird syntax aside, there are a couple advantages to being able to write stringize(item0, item1, item2). First, it allows stringize() to be used from within some other variadic function, without having to make that function a macro that accepts an arbitrary insertion-operator expression. There's no such thing as a member macro. Second, particularly for variadic functions, it allows us to optimize the single-argument case stringize(item0). A macro can't do that. When item0 is already a string of the desired char type, instead of streaming it into a std::ostringstream and retrieving it again, we can simply return the input string. When it's a pointer to the desired char type, we can directly construct the result string without the help of std::ostringstream. When it's a string of some other char type, we can engage ll_convert() to perform needed conversions. We generalize and optimize the generic gstringize() function, retaining the role of stringize() and wstringize() as thin wrappers that merely provide the desired char type. Optimizing the single-argument case requires separately defining gstringize() with two or more arguments: the general case. Then gstringize(arg) is delegated to a gstringize_impl class template so we can partially specialize to recognize a std::basic_string<desired_char_type> argument, as well as desired_char_type*. Both these specializations engage ll_convert(), which already handles the trivial case when no conversion is required. Use of ll_convert() in this role supercedes and generalizes the previous wstring_to_utf8str() and utf8str_to_wstring() overloads. Also introduce stream_to(std::ostream&, ...) to support variadic streaming to other destinations, e.g. a file, std::cout, ...
2021-11-22SL-16094 More profile hooks for threading code, remove redundant ↵Runitai Linden
wglCreateContextAttribs call
2021-11-22SL-16094 Add WorkQueue profile hooksRunitai Linden
2021-11-19SL-16094: fix merge glitchNat Goodspeed
2021-11-19SL-16094: Stylish braces!Nat Goodspeed
(cherry picked from commit 18de6c9b989cc7060f2a314f5b68cc102677823b)
2021-11-19SL-16202: Instantiate LLSimpleton::sInstance genericallyNat Goodspeed
instead of requiring a separate declaration for each subclass. The previous way produces errors in clang. (cherry picked from commit 8458ad8890cf0a11804996210d7bcfbdaa3eec2e)
2021-11-19SL-16329 - track frame time and jitter (as average deviation frame to frame) ↵Brad Payne (Vir Linden)
in stats window
2021-11-19SL-16094: Stylish braces!Nat Goodspeed