summaryrefslogtreecommitdiff
path: root/indra
AgeCommit message (Collapse)Author
2019-08-20Automated merge with ssh://bitbucket.org/andreykproductengine/drtvwr-493Nat Goodspeed
2019-08-20DRTVWR-493: Clarify capturing LLError::getFatalFunction() in a var.Nat Goodspeed
VS 2013 thought we were storing an initialization-list.
2019-08-20DRTVWR-493: Defend LL[Param]Singleton against ctor/init exceptions.Nat Goodspeed
An exception in the LLSingleton subclass constructor, or in its initSingleton() method, could leave the LLSingleton machinery in a bad state: the failing instance would remain in the MasterList, also on the stack of initializing LLSingletons. Catch exceptions in either and perform relevant cleanup. This problem is highlighted by test programs, in which LL_ERRS throws an exception rather than crashing the whole process. In the relevant catch clauses, clean up the initializing stack BEFORE logging. Otherwise we get tangled up recording bogus dependencies. Move capture_dependency() out of finishInitializing(): it must be called by every valid getInstance() call, both from LLSingleton and LLParamSingleton. Introduce new CONSTRUCTED EInitState value to distinguish "have called the constructor but not yet the initSingleton() method" from "currently within initSingleton() method." This is transient, but we execute the 'switch' on state within that moment. One could argue that the previous enum used INITIALIZING for current CONSTRUCTED, and INITIALIZED meant INITIALIZING too, but this is clearer. Introduce template LLSingletonBase::classname() helper methods to clarify verbose demangle(typeid(stuff).name()) calls. Similarly, introduce LLSingleton::pop_initializing() shorthand method.
2019-08-19DRTVWR-493: Improve exception safety of LLSingleton initialization.Nat Goodspeed
Add try/catch clauses to constructSingleton() (to catch exceptions in the subclass constructor) and finishInitializing() (to catch exceptions in the subclass initSingleton() method). Each of these catch clauses rethrows the exception -- they're for cleanup, not for ultimate handling. Introduce LLSingletonBase::reset_initializing(list_t::size_t). The idea is that since we can't know whether the exception happened before or after the push_initializing() call in LLSingletonBase's constructor, we can't just pop the stack. Instead, constructSingleton() captures the stack size before attempting to construct the new LLSingleton subclass. On exception, it calls reset_initializing() to restore the stack to that size. Naturally that requires a corresponding LLSingleton_manage_master method, whose MasterList specialization is a no-op. finishInitializing()'s exception handling is a bit simpler because it has a constructed LLSingleton subclass instance in hand, therefore push_initializing() has definitely been called, therefore it can call pop_initializing(). Break out new static capture_dependency() method from finishInitializing() because, in the previous LLSingleton::getInstance() implementation, the logic now wrapped in capture_dependency() was reached even in the INITIALIZED case. TODO: Add a new EInitState to differentiate "have been constructed, now calling initSingleton()" from "fully initialized, normal case" -- in the latter control path we should not be calling capture_dependency(). The LLSingleton_manage_master<LLSingletonBase::MasterList> specialization's get_initializing() function (which called get_initializing_from()) was potentially dangerous. get_initializing() is called by push_initializing(), which (in the general case) is called by LLSingletonBase's constructor. If somehow the MasterList's LLSingletonBase constructor ended up calling get_initializing(), it would have called get_initializing_from(), passing an LLSingletonBase which had not yet been constructed into the MasterList. In particular, its mInitializing map would not yet have been initialized at all. Since the MasterList must not, by design, depend on any other LLSingletons, LLSingleton_manage_master<LLSingletonBase::MasterList>::get_initializing() need not return a list from the official mInitializing map anyway. It can, and should, and now does, return a static dummy list. That obviates get_initializing_from(), which is removed. That in turn means we no longer need to pass get_initializing() an LLSingletonBase*. Remove that parameter.
2019-08-19DRTVWR-493: When a test fails due to exception, display exception.Nat Goodspeed
2019-08-14DRTVWR-493: Work around static initialization order problem.Nat Goodspeed
LLParamSingleton contained a static member mutex. Unfortunately that wasn't guaranteed to be initialized by the time its getInstance() was entered. Use a function-local static instead.
2019-08-14No such thing as 'virtual static'Nat Goodspeed
2019-08-14Merged in lindenlab/viewer-releaseandreykproductengine
2019-08-13DRTVWR-493 Test fix for W64andreykproductengine
2019-08-13DRTVWR-493 Converted LLViewerParcelMediaAutoPlay to singletonandreykproductengine
2019-08-13DRTVWR-493 Reworked a number of initsandreykproductengine
2019-08-13increment viewer version to 6.2.5Nat Goodspeed
2019-08-13SL-11718 Crash in LLRender2Dandreykproductengine
2019-08-12DRTVWR-493: Rely on recursive_mutex to handle circularityNat Goodspeed
from LLParamSingleton::initSingleton().
2019-08-12Automated merge with ssh://bitbucket.org/andreykproductengine/drtvwr-493Nat Goodspeed
2019-08-12DRTVWR-493: Permit LLParamSingleton::initSingleton() circularity.Nat Goodspeed
This was forbidden, but AndreyK points out cases in which LLParamSingleton:: initSingleton() should in fact be allowed to circle back to its own instance() method. Use a recursive_mutex instead of plain mutex to permit that; remove LL_ERRS preventing it. Add LLParamSingleton::instance() method that calls LLParamSingleton::getInstance(). Inheriting LLSingleton::instance() called LLSingleton::getInstance() -- not at all what we want. Add LLParamSingleton unit tests.
2019-08-12DRTVWR-493 LLWearableType to LLParamSingletonandreykproductengine
2019-08-12Merge from nat_linden/drtvwr-493andreykproductengine
2019-08-12SL-11719 Initialize the conversation dialog on login screen appearance to ↵AndreyL ProductEngine
avoid crash
2019-08-12Automated merge with file:///Users/nat/linden/viewer-catchNat Goodspeed
2019-08-12DRTVWR-493: Streamline LLParamSingleton, LLLockedSingleton.Nat Goodspeed
Simplify LLSingleton::SingletonLifetimeManager to SingletonInitializer: that struct has not been responsible for deletion ever since LLSingletonBase acquired dependency-ordered deleteAll(). Move SingletonData::mInitState changes from SingletonLifetimeManager to constructSingleton() method. Similarly, constructSingleton() now sets SingletonData::mInstance instead of making its caller store the pointer. Add variadic arguments to LLSingleton::constructSingleton() so we can reuse it for LLParamSingleton. Add finishInitializing() method to encapsulate logic reused for getInstance()'s INITIALIZING and DELETED cases. Make LLParamSingleton a subclass of LLSingleton, just as LLLockedSingleton is a subclass of LLParamSingleton. Make LLParamSingleton a friend of LLSingleton, so it can access private members of LLSingleton without also granting access to any DERIVED_CLASS subclass. This eliminates the need for protected getInitState(). LLParamSingleton::initParamSingleton() reuses LLSingleton::constructSingleton() and finishInitializing(). Its getInstance() method completely replaces LLSingleton::getInstance(): in most EInitStates, LLParamSingleton::getInstance() is an error. Use a std::mutex to serialize calls to LLParamSingleton::initParamSingleton() and getInstance(). While LLSingleton::getInstance() relies on the "initialized exactly once" guarantee for block-scope static declarations, LLParamSingleton cannot rely on the same mechanism. LLLockedSingleton is now a very succinct subclass of LLParamSingleton -- they have very similar functionality. Giving the LLSINGLETON() macro variadic arguments eliminates the need for a separate LLPARAMSINGLETON() macro, while continuing to support existing usage.
2019-08-12DRTVWR-493: Make catch_llerrs() a member of WrapLLErrs.Nat Goodspeed
2019-08-12Automated merge with ssh://bitbucket.org/nat_linden/viewer-vs2017Nat Goodspeed
2019-08-11DRTVWR-493 tiny optimizationandreykproductengine
2019-08-10DRTVWR-493: Introduce test catch_what(), catch_llerrs() functions.Nat Goodspeed
Use them in place of awkward try/catch test boilerplate.
2019-08-10DRTVWR-493 LLUI to LLParamSingletonandreykproductengine
2019-08-10DRTVWR-493 LLRender2D init cleanupandreykproductengine
2019-08-10SL-11716 Fixed crash on initializing LLUIAndreyL ProductEngine
2019-07-25DRTVWR-493 LLRender2D to LLParamSingletonandreykproductengine
2019-07-25SL-11649 FIXED [Love Me Render] Mesh links in HUDs do not have highlights ↵maxim_productengine
when selected.
2019-07-25DRTVWR-493 LLImage to LLParamSingletonandreykproductengine
2019-07-15SL-11528 FIXED Object Profile > Details does not show magenta highlight for ↵maxim_productengine
mesh objects
2019-07-12Merged in ruslantproductengine/viewer-cougar-4cr-5 (pull request #59)Ruslan Teliuk
SL-11435 When ALM is enabled, Depth mode shots are broken when snapshot size is set to anything above current window size Approved-by: Simon Linden <simon@lindenlab.com> Approved-by: Andrey Lihatskiy <andreylproductengine@lindenlab.com>
2019-07-11SL-11435 When ALM is enabled, Depth mode shots are broken when snapshot size ↵ruslantproductengine
is set to anything above current window size - fixed bug described in the ticket - fixed bug with UI (when user change the layer type (color/depth))
2019-07-11DRTVWR-493 Cleanup LLSkinningUtilandreykproductengine
2019-07-04DRTVWR-493 Cleaned up unneded inits.andreykproductengine
2019-07-04DRTVWR-493 LLUrlWhiteList to LLSingletonandreykproductengine
2019-07-04SL-11534 FIXED Animated mesh objects aren't highlighted when viewing objects ↵maxim_productengine
owned by users in the 'About Land' floater
2019-07-03DRTVWR-493 LLAvatarNameCache to singletoneandreykproductengine
2019-06-27DRTVWR-493 LLSpellcheck doesn't need separate initandreykproductengine
2019-06-27Backed out changeset: 920a0dbf290a Machine id is needed after singletons dieandreykproductengine
2019-06-26DRTVWR-476: Pass Obj-C++ switch needed for BugsplatMac on Xcode 10.2.Nat Goodspeed
2019-06-24Merged in lindenlab/viewer-releaseAndreyL ProductEngine
2019-06-24DRTVWR-493 Cleanup LLFirstUseandreykproductengine
2019-06-21DRTVWR-493 LLViewerParcelMedia to singletonandreykproductengine
2019-06-21DRTVWR-493 LLViewerMedia to singletonandreykproductengine
2019-06-20increment viewer version to 6.2.4Nat Goodspeed
2019-06-20DRTVWR-493 LLLocalBitmapMgr to Singletonandreykproductengine
2019-06-20DRTVWR-493 LLHint to singletonandreykproductengine
2019-06-19DRTVWR-493 LLMachineId to singletonandreykproductengine