Commit Graph

1067 Commits (a9cf349de4fea24d0cc0ad659bde7327ec623005)

Author SHA1 Message Date
Nat Goodspeed b2913b7cf1 DRTVWR-494: Defend LLInstanceTracker against multi-thread usage.
The previous implementation went to some effort to crash if anyone attempted
to create or destroy an LLInstanceTracker subclass instance during traversal.
That restriction is manageable within a single thread, but becomes unworkable
if it's possible that a given subclass might be used on more than one thread.

Remove LLInstanceTracker::instance_iter, beginInstances(), endInstances(),
also key_iter, beginKeys() and endKeys(). Instead, introduce key_snapshot()
and instance_snapshot(), the only means of iterating over LLInstanceTracker
instances. (These are intended to resemble functions, but in fact the current
implementation simply presents the classes.) Iterating over a captured
snapshot defends against container modifications during traversal. The term
'snapshot' reminds the coder that a new instance created during traversal will
not be considered. To defend against instance deletion during traversal, a
snapshot stores std::weak_ptrs which it lazily dereferences, skipping on the
fly any that have expired.

Dereferencing instance_snapshot::iterator gets you a reference rather than a
pointer. Because some use cases want to delete all existing instances, add an
instance_snapshot::deleteAll() method that extracts the pointer. Those cases
used to require explicitly copying instance pointers into a separate
container; instance_snapshot() now takes care of that. It remains the caller's
responsibility to ensure that all instances of that LLInstanceTracker subclass
were allocated on the heap.

Replace unkeyed static LLInstanceTracker::getInstance(T*) -- which returned
nullptr if that instance had been destroyed -- with new getWeak() method
returning std::weak_ptr<T>. Caller must detect expiration of that weak_ptr.

Adjust tests accordingly.

Use of std::weak_ptr to detect expired instances requires engaging
std::shared_ptr in the constructor. We now store shared_ptrs in the static
containers (std::map for keyed, std::set for unkeyed).

Make LLInstanceTrackerBase a template parameterized on the type of the static
data it manages. For that reason, hoist static data class declarations out of
the class definitions to an LLInstanceTrackerStuff namespace.

Remove the static atomic sIterationNestDepth and its methods incrementDepth(),
decrementDepth() and getDepth(), since they were used only to forbid creation
and destruction during traversal.

Add a std::mutex to static data. Introduce an internal LockStatic class that
locks the mutex while providing a pointer to static data, making that the only
way to access the static data.

The LLINSTANCETRACKER_DTOR_NOEXCEPT macro goes away because we no longer
expect ~LLInstanceTracker() to throw an exception in test programs.
That affects LLTrace::StatBase as well as LLInstanceTracker itself.

Adapt consumers to the new LLInstanceTracker API.
2019-12-02 14:39:24 -05:00
andreykproductengine 37eb735ba7 Merged in lindenlab/viewer-release 2019-09-10 20:30:25 +03:00
andreykproductengine 1233842012 SL-11718 Crash in LLRender2D 2019-08-13 17:22:58 +03:00
Nat Goodspeed 98be6e141c DRTVWR-493: Streamline LLParamSingleton, LLLockedSingleton.
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-12 09:44:56 -04:00
andreykproductengine 1be08814e2 DRTVWR-493 tiny optimization 2019-08-11 12:50:24 +03:00
andreykproductengine 34d8200d0f DRTVWR-493 LLRender2D init cleanup 2019-08-10 09:01:54 +03:00
andreykproductengine adeee613c6 DRTVWR-493 LLRender2D to LLParamSingleton 2019-07-25 18:20:17 +03:00
AndreyL ProductEngine 5715cda6e0 Merged in lindenlab/viewer-release 2019-03-01 10:55:47 +02:00
ruslantproductengine 4f458882f4 - add static const 2019-01-14 18:58:30 +02:00
Nat Goodspeed 4b99e6a1f1 SL-10252: On Windows, use $SystemRoot again, not FOLDERID_Fonts. 2018-12-17 15:23:57 -05:00
Nat Goodspeed 4a13657285 SL-10153: auto name{expression} declares an initializer_list
instead of a variable of type decltype(expression).

Using SHGetKnownFolderPath(FOLDERID_Fonts) in LLFontGL::getFontPathSystem()
requires new Windows #include files.

A variable with a constructor can't be declared within the braces of a switch
statement, even outside any of its case clauses.
2018-12-15 09:13:24 -05:00
Nat Goodspeed c4096f670c SL-10153: Review and rationalize fetching paths from environment.
Use LLStringUtil::getenv() or getoptenv() whenever we fetch a string that will
be used as a pathname.

Use LLFile::tmpdir() instead of getenv("TEMP").

As an added extra-special bonus, finally clean up $TMP/llcontrol-test-zzzzzz
directories that have been accumulating every time we run a local build!
2018-12-14 15:38:13 -05:00
AndreyL ProductEngine 892d3a9bf8 Merged in lindenlab/viewer-release 2018-09-27 13:04:12 +03:00
maxim_productengine f46969fec7 SL-11139 FIXED LLFontGL::getStringFromStyle() never return "NORMAL" 2019-05-13 18:17:16 +03:00
AndreyL ProductEngine 65bf63c973 Merged in lindenlab/viewer-bear 2019-04-02 22:12:55 +03:00
maxim_productengine fd7b0e19da SL-10610 FIXED Floaters fails to display certain symbols. Added ability to load font collections. 2019-03-19 11:16:24 +02:00
Mnikolenko ProductEngine eed5671681 SL-10610 mac fix for showing special characters 2019-03-13 14:21:38 +02:00
Graham Linden 3237923e10 MAINT-3699 new shaders supporting alpha blend/mask rigged content.
Make shader loading debug logging of uniforms use ShaderUniform to make supression simpler.
2018-08-16 00:31:39 +01:00
AndreyL ProductEngine 3983f5b1e2 Merged in lindenlab/viewer-release 2018-08-02 23:18:28 +03:00
andreykproductengine e24d4c9f4d MAINT-8923 Better allocation failure handling, createGLTexture crashes 2018-07-26 20:06:26 +03:00
AndreyL ProductEngine c877eac422 Fixed line endings in llgl.cpp 2018-07-04 11:56:01 +03:00
Graham Linden 5e12beba70 MAINT-7548 MAINT-7560 use NvidiaOptimusEnablement globally exported var to signal desire to use high-performance graphics processor 2018-07-02 19:30:31 +01:00
AndreyL ProductEngine 64b3473f49 Merged in lindenlab/viewer-release 2018-05-18 03:02:44 +03:00
andreykproductengine 30be0b0560 MAINT-8686 Mode detailed VBO crash logging 2018-06-04 19:37:30 +03:00
AndreyL ProductEngine af9069edbf Merged in lindenlab/viewer-release 2018-03-02 00:47:08 +02:00
Andrey Kleshchev 4156fb832c MAINT-6363 Normal and specular maps should not be downloaded if ALM is off 2018-03-06 12:59:32 +00:00
andreykproductengine d9064d3a4e MAINT-8317 Fixed Local Textures for Advanced Lighting Projectors do not keep the selected texture. 2018-02-27 15:49:15 +02:00
Graham Linden graham@lindenlab.com 06bce2ddd0 Add debug setting and code to allow nVidia nSight graphics debugging to capture SL frames.
These changes are only enabled if RenderNsightDebugSupport is true and eliminate use of
some OpenGL legacy functionality which is incompatible with nSight capture
(mostly glReadPixels and other fixed-function pipe rendering calls).
2018-02-15 21:55:24 +00:00
andreykproductengine 8f65593786 MAINT-8146 Clearing pointers 2018-02-13 14:45:09 +02:00
andreykproductengine e394c0623d MAINT-8146 Remade fix with streams to save memory 2018-02-12 19:31:53 +02:00
ruslantproductengine 0f690ab4da Add const 2018-01-30 17:07:27 +02:00
ruslantproductengine 55990724a3 Keep attributes name (useful for debug) 2018-01-30 17:07:00 +02:00
Andrey Kleshchev 6e445e82e2 MAINT-8091 Removed deprecated and unused private memory pooling 2018-01-30 14:03:26 +00:00
AndreyL ProductEngine 15c62d9e71 Merged in lindenlab/viewer-bear 2018-01-17 03:58:24 +02:00
AndreyL ProductEngine 57a99273ed Merged in lindenlab/viewer-release 2018-01-17 03:20:12 +02:00
andreykproductengine 56c878925a MAINT-7003 Crash in LLVBOPool
Error to help figuring out if error happens due to gl or memory issue
2018-01-12 18:54:20 +02:00
AndreyL ProductEngine 7d156389e4 MAINT-8043 Fix for bad_alloc crash in LLImageGL::setImage() 2017-12-18 20:29:50 +02:00
andreykproductengine 1f56b223d7 MAINT-8101 Added sanity check to confirm crash location 2017-12-18 15:15:54 +02:00
Nat Goodspeed e3a2c5e321 DRTVWR-418: Merge from latest viewer-release 2017-11-29 14:47:09 -05:00
andreykproductengine fadb3792ca MAINT-8146 Fixed Installing viewer to non default path results in incorrect fonts loading 2018-01-09 20:31:21 +02:00
andreykproductengine 5a402dbc1f MAINT-7228 Vertex buffer allocation failure handling 2017-11-16 17:11:48 +02:00
ruslantproductengine df376c0299 MAINT-6437 - Tile-Based Texture Animation Scales Incorrectly for Rigged Mesh when worn (MacOS only)
FIXED.
2017-12-26 18:20:06 +02:00
andreykproductengine e848127f23 MAINT-7228 Substituted assert with error 2017-11-03 19:27:09 +02:00
andreykproductengine 149b2d88dd MAINT-7228 Vertex buffer allocation failure handling 2017-11-01 19:36:13 +02:00
ruslantproductengine 325c076d09 MAINT-7213 Shared media (media as a texture) unusable with transparent mesh
New outline selection around mesh objects.
2017-10-26 18:33:08 +03:00
AndreyL ProductEngine 8c03881193 Merged in lindenlab/viewer-lynx 2017-11-22 16:44:36 +02:00
andreykproductengine 8da9e0ffd7 MAINT-72 unmapBuffer crash 2017-11-17 17:33:10 +02:00
Nat Goodspeed 0c7bc67814 Automated merge with ssh://bitbucket.org/lindenlab/viewer-release 2017-10-11 14:35:49 -04:00
Nat Goodspeed d1ab470542 DRTVWR-418: Fix C++ errors detected by Xcode 9.
You can't legitimately perform an ordered comparison between a pointer and an
int, even 0. Fix a number of 'if (ptr > 0)' to plain 'if (ptr)'.

Fix LLEditWearableDictionary::WearableEntry constructor to avoid varargs
mechanism. It used to accept three different counts, followed by three
different lists of enums, fetched in each case as 'int' -- dubious in itself.
The constructor body performed three different loops to populate those enums
into three different member vectors.

Instead, make the constructor accept three vectors and initialize the member
vectors from the passed vectors. Now that C++ has inline vector
initialization, change existing constructor calls to pass temporary vectors
initialized with what used to be the varargs enum values.
2017-09-20 16:58:58 -04:00
ruslantproductengine 0e9fb587fa MAINT-7813 - 3D rendering broken on Windows in build 508618. 3D rendering starts before 2D login screen is cleared.
FIXED
2017-09-18 21:02:53 +03:00