Age | Commit message (Collapse) | Author |
|
out-of-order deletion of LLTextureFetch on shutdown
|
|
|
|
|
|
|
|
as in release
|
|
on and off.
|
|
|
|
|
|
|
|
|
|
HTTP when all objects loading are done.
|
|
As a viewer architect, I would like to understand how fast each of the components of the texture pipeline can run in isolation
|
|
|
|
|
|
Reviewed by Simon
|
|
|
|
|
|
|
|
read latency
|
|
occlusion queries from previous frame are still pending and perform texture decode work.
|
|
|
|
|
|
quit.
|
|
|
|
|
|
|
|
accessed through the static LLThread::tldata().
Currently this object contains two (public) thread-local
objects: a LLAPRRootPool and a LLVolatileAPRPool.
The first is the general memory pool used by this thread
(and this thread alone), while the second is intended
for short lived memory allocations (needed for APR).
The advantages of not mixing those two is that the latter
is used most frequently, and as a result of it's nature
can be destroyed and reconstructed on a "regular" basis.
This patch adds LLAPRPool (completely replacing the old one),
which is a wrapper around apr_pool_t* and has complete
thread-safity checking.
Whenever an apr call requires memory for some resource,
a memory pool in the form of an LLAPRPool object can
be created with the same life-time as this resource;
assuring clean up of the memory no sooner, but also
not much later than the life-time of the resource
that needs the memory.
Many, many function calls and constructors had the
pool parameter simply removed (it is no longer the
concern of the developer, if you don't write code
that actually does an libapr call then you are no
longer bothered with memory pools at all).
However, I kept the notion of short-lived and
long-lived allocations alive (see my remark in
the jira here: https://jira.secondlife.com/browse/STORM-864?focusedCommentId=235356&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-235356
which requires that the LLAPRFile API needs
to allow the user to specify how long they
think a file will stay open. By choosing
'short_lived' as default for the constructor
that immediately opens a file, the number of
instances where this needs to be specified is
drastically reduced however (obviously, any
automatic LLAPRFile is short lived).
***
Addressed Boroondas remarks in https://codereview.secondlife.com/r/99/
regarding (doxygen) comments. This patch effectively only changes comments.
Includes some 'merge' stuff that ended up in llvocache.cpp
(while starting as a bug fix, now only resulting in a cleanup).
***
Added comment 'The use of apr_pool_t is OK here'.
Added this comment on every line where apr_pool_t
is correctly being used.
This should make it easier to spot (future) errors
where someone started to use apr_pool_t; you can
just grep all sources for 'apr_pool_t' and immediately
see where it's being used while LLAPRPool should
have been used.
Note that merging this patch is very easy:
If there are no other uses of apr_pool_t in the code
(one grep) and it compiles, then it will work.
***
Second Merge (needed to remove 'delete mCreationMutex'
from LLImageDecodeThread::~LLImageDecodeThread).
***
Added back #include <apr_pools.h>.
Apparently that is needed on libapr version 1.2.8.,
the version used by Linden Lab, for calls to
apr_queue_*. This is a bug in libapr (we also
include <apr_queue.h>, that is fixed in (at least) 1.3.7.
Note that 1.2.8 is VERY old. Even 1.3.x is old.
***
License fixes (GPL -> LGPL). And typo in comments.
Addresses merov's comments on the review board.
***
Added Merov's compile fixes for windows.
|
|
|
|
Viewer attempting to load precached images in file types that are not being used.)
|
|
|
|
Linux startup crash appears to be due to static/global C++ init of LLAtomic
types. The initializer with explicit value makes some runtime calls and it
looks like these assume, at least on Linux, that apr_initialize() has been
called. So move the static POST count to a member and provide accessors
and increment/decrement. Command queue was built on a pointer to a class
in anonymous namespace and that's not quite valid. Made it a nested
class (really a nested forward declaration) while keeping the derived
classes in anonymous.
|
|
Legacy of the LLSD::Map-to-LLSD::Array conversion, this ended up
performing an erase on the array rather than the map taking out
all the regions. So, there *was* a metrics report, it was just empty
of regions. Fixed and scanned for more array/map problems and
corrected the data type for duration sorts (should have been Real).
|
|
|
|
correct but looked a bit dodgy with pointer ownership.
|
|
First, introduced a compact payload format that allows blocks of
metrics to be dropped from the viewer->collector payload compressing
1200 bytes of LLSD into about 300, give-or-take. Then converted
to using LLSD arrays in the payload to enumerate the regions
encountered. This simplifies much data handling from the viewer
all the way into the final formatter of the metrics on the grid.
|
|
representation transferring ownership, doing data aggregation
in a very pedantic way. That's just adding unneeded cost and
complication. Used the same objects to transport data as are
collecting it and everything got simpler, faster, easier to
read with fewer gotchas. Bit myself *again* doing the min/max/mean
merges but the unittests where there to pick me up again. Added
a per-region FPS metric while I was at it. This is much asked
for and there was a convenient place to sample the value.
|
|
|
|
Cleaned up some of the messaging code that sends the LLSD stats
report off to the viewer. Added WARNS-level messages when there's
a problem with delivery that will result in a data break. Users
probably won't care. Added an outbound data throttle that limits
stats to the 10 regions of longest occupancy. Should be a
reasonable first cut.
|
|
The TextureFetch thread was still stalling out due to
a different path that determines whether there is work
or not in the thread (uses getPending()) and that had
to be harmonized with the changes to runCondition().
I'm not happy with this solution but a refactor of the
LLThread tree isn't in the cards right now.
|
|
In the viewer, the region's UUID is acquired very late and isn't generally
used as the canonical region identifier. The U64 region hash is a better
and more consistently used identifier so I'm moving over to using that as
the region key. Don't have a proper reserved invalid region hash which is
unfortunate, but then, so much is.
|
|
timestamps.
The min/max response time calculations needed to be sensitive to the response
counts to know if their was actual data. Failure to do so introduced a
gratuitous min/max test against zero values which tended to corrupt the
mins. Unit tests added to test for this condition. Finished conversion
of times to floating point seconds. Removed two logging events used to
debug the cross-thread messaging. Looks like a code completion point.
|
|
Using unpause() method in derived class rather than wake() in furthest base class
solved the stalling problem. I still think too many levels of the
LLTextureFetch hierarchy are keeping thread state, however. The
LLViewerRegion instance an agent enters doesn't necessarily have its
region_id yet, that only comes after the handshake, if any. So add
a few more metrics insertion points to propagate region into metrics.
Finally, try to launch a final metrics report when a quit is initiated.
|
|
After discussions, renamed 'QAModeMetricsSubmetrics' to 'QAModeMetrics'
and confirmed that LLCachedControl<> is the way to go. Moved the
resulting flag out of LLViewerAssetStats (where it didn't belong)
and it lives in both LLAppViewer and LLTextureFetch where it does
belong.
|
|
Detect QAMode (and new QAModeMetricsSubmode) settings which
enable logging of metrics report locally and a faster cycle
time to reduce test waiting. Do this only in the main thread
and propagate the result via collector constructors (will
likely move that out and put it in llappviewer/lltexturefetch
which is more correct scope). Managed to deadlock myself with
a recursive mutex (sheesh).
|
|
Removed declared but undefined interfaces from LLTextureFetch family.
Had inserted the cross-thread command processor into some of
LLTextureFetchWorker's processing which was unnatural and
probably wrong. Moved it to LLTextureFetch which turned out to
be far, far more natural. Better documentation on the asLLSD()
format. Refined LLSD stats merger logic and enhanced unit
tests to verify same.
|
|
Code complete with the intelligence to merge counts, mins,
maxes and means with reasonable defences. Added QAMode
controls to the viewer so that we can QA this more quickly
by reducing the timing interval and sending the metrics
body to local logging as well as to the caps service.
|
|
Asset fetch requests wrapped to allow for measurements.
Asset fetch enqueues, dequeues and completion times recorded
to asset stats collector. Texture fetch operations (http
and udp) recorded to asset stats collector. Stats collector
time vallue switched from F32 to U64 which is the more common
type in the viewer. Cross-thread mechanism introduced to
communicate region changes and generate global statistics
messages. Facility to deliver metrics via Capabilities
sketched in but needs additional work. Documentation and
diagrams added.
|
|
|
|
|
|
greedy with file handles / 'WARNING: ll_apr_warn_status: APR: Too many open files'
(transplanted from a9aefa70c029eb9dddec3833d0ce22ef4b4421b5)
|