Commit Graph

363 Commits (c847a5eaac635604a2490872c0ee8cc947273cf5)

Author SHA1 Message Date
Andrey Lihatskiy ddbe1ff981 Fix xcode16 build errors 2025-02-13 17:30:08 +02:00
Brad Linden e23f2f1cf7 defensively capture coroutine args by value 2024-08-26 15:01:04 -07:00
Rye Mutt b5e306f7d8
Enable /permissive- on MSVC for better standards conformance (#2251)
* Enable /permissive- on MSVC for better C++ conformance and fix related errors

* Clean up left over warning suppressions from old library or msvc versions
2024-08-14 08:01:02 -07:00
Alexander Gavriliuk 2ea5ac0c43 #1111 Remove xmlrpc-epi 2024-07-01 20:20:04 +02:00
Andrey Lihatskiy 1b68f71348 #824 Process source files in bulk: replace tabs with spaces, convert CRLF to LF, and trim trailing whitespaces as needed 2024-04-29 07:56:09 +03:00
AiraYumi 7c8907522f replace boost library to standard 2024-01-08 23:29:21 +02:00
Nicky Dasmijn 0710d95f4b Merge remote-tracking branch 'origin/DRTVWR-543-maint_cmake' into DRTVWR-568_cmake 2022-09-16 23:15:49 +02:00
Nicky 62053e1e88 Merge remote-tracking branch 'origin/DRTVWR-543-maint_cmake' into DRTVWR-543-maint_cmake 2022-05-07 18:10:29 +02:00
Nicky 283c2a20cc Remove setting of HEADER_FILE_ONLY on .h* files, cmake automatically
sets the property on those.
2022-05-01 00:38:40 +02:00
Nicky e0cf0cdfd4 Switch to target_include_directories
All 3Ps include dirs are treated as SYSTEM, this will stop compilers
stop emitting warnings from those files and greatly helps having high
warning levels and not being swamped by warnings that come from
external libraries.
2022-04-17 18:04:57 +02:00
Andrey Kleshchev efb9df04c3 SL-16831 Don't wait for an updater on login failure unles it's the cause of failure 2022-04-15 20:53:21 +03:00
Nicky 786b291d9c Move CMake files to modernized cmake syntax, step 1.
Change projects to cmake targetsto get rid of havig to hardcore
include directories and link libraries in consumer projects.
2022-04-06 16:32:52 +02:00
Andrey Kleshchev 3feb92046f SL-16831 Viewer stalls for 10 seconds before displaying a login failure
# Conflicts:
#	indra/newview/llstartup.cpp
2022-03-29 16:22:11 +03:00
Andrey Kleshchev 090b506612 SL-16831 Viewer stalls for 10 seconds before displaying a login failure 2022-03-24 18:47:08 +02:00
Andrey Kleshchev 150993e2c2 SL-16450 Don not crash viewer in case of invalid data type 2021-12-08 21:51:32 +02:00
Andrey Kleshchev 25e0ab2077 SL-16032 Crash due to missing xmlrpc_type_empty support 2021-09-18 00:52:24 +03:00
Nat Goodspeed 87da08b1f4 DRTVWR-476, SL-13555: Don't crash if user closes viewer during login.
Ever since February 2010, the body of the login coroutine function has been
enclosed in try/catch (...), with an llerrs message to try to crash more
informatively than the runtime's unhandled-exception termination. Over the
years this evolved to LL_ERRS and then to CRASH_ON_UNHANDLED_EXCEPTION.

This persisted despite the August 2016 addition of generic catch clauses in
the LLCoros::toplevel() function to serve the same purpose, and despite the
subsequent introduction of the LLCoros::Stop family of exceptions to
deliberately throw into waiting coroutines on viewer shutdown.

That's exactly what was happening. When the user closed the viewer while
waiting for the response from login.cgi, the waiting operation threw
LLCoros::Stopping, which was caught by that CRASH_ON_UNHANDLED_EXCEPTION,
which crashed the viewer with LL_ERRS rather than propagating up to the
toplevel() and cleanly terminating the coroutine.

Change CRASH_ON_UNHANDLED_EXCEPTION() to LOG_UNHANDLED_EXCEPTION() and
re-throw so toplevel() can handle.
2020-07-07 14:48:36 -04:00
Nat Goodspeed fde7dad001 DRTVWR-476: Make LoginListener::waitFor() take arbitrary predicate.
This allows one of the tests to specifically waitFor() the completion status
update from LLLogin, rather than the next status update to come along: the
coroutine potentially emits a whole sequence of status updates before
completion.

Then the waitFor() overload that merely waits for the next status update is
implemented by passing that specific predicate to the other overload.
2020-04-03 10:49:16 -04:00
Nat Goodspeed dc07509f29 DRTVWR-476: Cherry-pick debug aids from commit 77b0c53 (fiber-mutex) 2020-04-03 10:38:53 -04:00
Nat Goodspeed 2a56ab4436 DRTVWR-476, SL-12197: Don't throw Stopping from main coroutine.
The new LLCoros::Stop exception is intended to terminate long-lived coroutines
-- not interrupt mainstream shutdown processing. Only throw it on an
explicitly-launched coroutine.

Make LLCoros::getName() (used by the above test) static. As with other LLCoros
methods, it might be called after the LLCoros LLSingleton instance has been
deleted. Requiring the caller to call instance() implies a possible need to
also call wasDeleted(). Encapsulate that nuance into a static method instead.
2020-03-25 19:24:25 -04:00
Nat Goodspeed 28a54c2f7b DRTVWR-476: Infrastructure to help manage long-lived coroutines.
Introduce LLCoros::Stop exception, with subclasses Stopping, Stopped and
Shutdown. Add LLCoros::checkStop(), intended to be called periodically by any
coroutine with nontrivial lifespan. It checks the LLApp status and, unless
isRunning(), throws one of these new exceptions.

Make LLCoros::toplevel() catch Stop specially and log forcible coroutine
termination.

Now that LLApp status matters even in a test program, introduce a trivial
LLTestApp subclass whose sole function is to make isRunning() true.
(LLApp::setStatus() is protected: only a subclass can call it.) Add LLTestApp
instances to lleventcoro_test.cpp and lllogin_test.cpp.

Make LLCoros::toplevel() accept parameters by value rather than by const
reference so we can continue using them even after context switches.

Make private LLCoros::get_CoroData() static. Given that we've observed some
coroutines living past LLCoros destruction, making the caller call
LLCoros::instance() is more dangerous than encapsulating it within a static
method -- since the encapsulated call can check LLCoros::wasDeleted() first
and do something reasonable instead. This also eliminates the need for both a
const and non-const overload.

Defend LLCoros::delete_CoroData() (cleanup function for fiber_specific_ptr for
CoroData, implicitly called after coroutine termination) against calls after
~LLCoros().

Add a status string to coroutine-local data, with LLCoro::setStatus(),
getStatus() and RAII class TempStatus.

Add an optional 'when' string argument to LLCoros::printActiveCoroutines().
Make ~LLCoros() print the coroutines still active at destruction.
2020-03-25 19:02:24 -04:00
Nat Goodspeed a9191a83d9 SL-1968: Extend lllogin_test login-failed cases for new sync timing.
On login failure, LLLogin now tries to sync up with SLVersionChecker. It waits
for up to 10 seconds before shrugging and giving up. Since that coroutine can
now block for that long, make the llogin_test failure cases wait at least that
long too.
2020-03-25 18:44:04 -04:00
Anchor 1ea42d88f7 [DRTVWR-476] - compile error fix 2020-03-25 18:39:20 -04:00
Nat Goodspeed 101ab28f0c SL-793: Fix lllogin_test.cpp for new LLCoros implementation.
Delete the test for SRV timeout: lllogin no longer issues an SRV query. That
test only confuses the test program without exercising any useful paths in
production code.

As with other tests dating from the previous LLCoros implementation, we need a
few llcoro::suspend() calls sprinkled in so that a fiber marked ready -- by
fulfilling the future for which it is waiting -- gets a chance to run.

Clear LLEventPumps between test functions.
2020-03-25 18:39:20 -04:00
Nat Goodspeed 66981fab0b SL-793: Use Boost.Fiber instead of the "dcoroutine" library.
Longtime fans will remember that the "dcoroutine" library is a Google Summer
of Code project by Giovanni P. Deretta. He originally called it
"Boost.Coroutine," and we originally added it to our 3p-boost autobuild
package as such. But when the official Boost.Coroutine library came along
(with a very different API), and we still needed the API of the GSoC project,
we renamed the unofficial one "dcoroutine" to allow coexistence.

The "dcoroutine" library had an internal low-level API more or less analogous
to Boost.Context. We later introduced an implementation of that internal API
based on Boost.Context, a step towards eliminating the GSoC code in favor of
official, supported Boost code.

However, recent versions of Boost.Context no longer support the API on which
we built the shim for "dcoroutine." We started down the path of reimplementing
that shim using the current Boost.Context API -- then realized that it's time
to bite the bullet and replace the "dcoroutine" API with the Boost.Fiber API,
which we've been itching to do for literally years now.

Naturally, most of the heavy lifting is in llcoros.{h,cpp} and
lleventcoro.{h,cpp} -- which is good: the LLCoros layer abstracts away most of
the differences between "dcoroutine" and Boost.Fiber.

The one feature Boost.Fiber does not provide is the ability to forcibly
terminate some other fiber. Accordingly, disable LLCoros::kill() and
LLCoprocedureManager::shutdown(). The only known shutdown() call was in
LLCoprocedurePool's destructor.

We also took the opportunity to remove postAndSuspend2() and its associated
machinery: FutureListener2, LLErrorEvent, errorException(), errorLog(),
LLCoroEventPumps. All that dual-LLEventPump stuff was introduced at a time
when the Responder pattern was king, and we assumed we'd want to listen on one
LLEventPump with the success handler and on another with the error handler. We
have never actually used that in practice. Remove associated tests, of course.

There is one other semantic difference that necessitates patching a number of
tests: with "dcoroutine," fulfilling a future IMMEDIATELY resumes the waiting
coroutine. With Boost.Fiber, fulfilling a future merely marks the fiber as
ready to resume next time the scheduler gets around to it. To observe the test
side effects, we've inserted a number of llcoro::suspend() calls -- also in
the main loop.

For a long time we retained a single unit test exercising the raw "dcoroutine"
API. Remove that.

Eliminate llcoro_get_id.{h,cpp}, which provided llcoro::get_id(), which was a
hack to emulate fiber-local variables. Since Boost.Fiber has an actual API for
that, remove the hack.

In fact, use (new alias) LLCoros::local_ptr for LLSingleton's dependency
tracking in place of llcoro::get_id().

In CMake land, replace BOOST_COROUTINE_LIBRARY with BOOST_FIBER_LIBRARY. We
don't actually use the Boost.Coroutine for anything (though there exist
plausible use cases).
2020-03-25 17:32:45 -04:00
Nat Goodspeed 05068186c3 DRTVWR-474: Make login coroutine sync with updater process on failure.
Specifically, introduce an LLEventMailDrop("LoginSync"). When the updater
detects that an update is required, it will post to that rendezvous point.

When login.cgi responds with login failure, make the login coroutine wait (a
few seconds) for that ping from the updater.

If we receive that ping and if it contains a "reply" key, make the fail.login
listener respond to the updater with an indication of whether to proceed with
update.

If both login.cgi and the updater concur that an update is required, produce a
new confirmation message for the user and then (once user responds) tell the
updater to proceed. Otherwise, produce the usual login-failure message and
tell the updater never mind.

Introduce LLCoro::OverrideConsuming to provide temporary save/restore of the
set_consuming() / get_consuming() flag. It's a good idea to set the consuming
flag when retrieving data from an LLEventMailDrop.
2018-10-04 16:35:38 -04:00
Oz Linden e044902aaf SL-702: refactor to make the viewer-manager easier for TPVs to integrate 2017-05-24 09:41:44 -04:00
coyot@coyot-sager-PC 3a3da6e4a7 merge 2017-02-28 22:56:30 +00:00
coyot@coyot-sager-PC 069c938eb6 pull from rev d22beb597e52ecbf1c98f25d4489ea0425eda4b0 of sl-321 2017-02-28 22:35:01 +00:00
Nat Goodspeed 4d10172d8b MAINT-5011: Catch unhandled exceptions in LLCoros coroutines.
Wrap coroutine call in try/catch in top-level coroutine wrapper function
LLCoros::toplevel(). Distinguish exception classes derived from
LLContinueError (log and continue) from all others (crash with LL_ERRS).

Enhance CRASH_ON_UNHANDLED_EXCEPTIONS() and LOG_UNHANDLED_EXCEPTIONS() macros
to accept a context string to supplement the log message. This lets us replace
many places that called boost::current_exception_diagnostic_information() with
LOG_UNHANDLED_EXCEPTIONS() instead, since the explicit calls were mostly to
log supplemental information.

Provide supplemental information (coroutine name, function parameters) for
some of the previous LOG_UNHANDLED_EXCEPTIONS() calls. This information
duplicates LL_DEBUGS() information at the top of these functions, but in a
typical log file we wouldn't see the LL_DEBUGS() message.

Eliminate a few catch (std::exception e) clauses: the information we get from
boost::current_exception_diagnostic_information() in a catch (...) clause
makes it unnecessary to distinguish.

In a few cases, add a final 'throw;' to a catch (...) clause: having logged
the local context info, propagate the exception to be caught by higher-level
try/catch.

In a couple places, couldn't resist reconciling indentation within a
particular function: tabs where the rest of the function uses tabs, spaces
where the rest of the function uses spaces.

In LLLogin::Impl::loginCoro(), eliminate some confusing comments about an
array of rewritten URIs that date back to a long-deleted implementation.
2016-08-18 17:33:44 -04:00
Glenn Glazer c8c143e774 SL-323: first pass at ripping out old updater 2016-08-18 13:05:30 -07:00
Nat Goodspeed 993f54f6e9 MAINT-5011: Try to enrich catch (...) logging throughout viewer.
Turns out we have a surprising number of catch (...) clauses in the viewer
code base. If all we currently do is

    LL_ERRS() << "unknown exception" << LL_ENDL;

then call CRASH_ON_UNHANDLED_EXCEPTION() instead. If what we do is

    LL_WARNS() << "unknown exception" << LL_ENDL;

then call LOG_UNHANDLED_EXCEPTION() instead.

Since many places need LOG_UNHANDLED_EXCEPTION() and nobody catches
LLContinueError yet, eliminate LLContinueError& parameter from
LOG_UNHANDLED_EXCEPTION(). This permits us to use the same log message as
CRASH_ON_UNHANDLED_EXCEPTION(), just with a different severity level.

Where a catch (...) clause actually provides contextual information, or makes
an error string, add boost::current_exception_diagnostic_information() to try
to figure out actual exception class and message.
2016-08-17 15:40:03 -04:00
Glenn Glazer 8ae320edf1 SL-323: remove vmp icons from viewer_components subtree 2016-08-17 08:50:43 -07:00
Nat Goodspeed 5e9d2f57c8 MAINT-5011: Use LLTHROW() instead of plain BOOST_THROW_EXCEPTION().
A level of preprocessor indirection lets us later change the implementation if
desired.
2016-08-17 11:36:24 -04:00
Glenn Glazer 3e55d8c77a SL-323: add icon support for macs, text flow in Tkinter windows 2016-08-17 08:20:12 -07:00
Glenn Glazer 4a124b8b9d SL-323: logging improvements 2016-08-16 09:17:07 -07:00
Glenn Glazer 5811b4721f SL-323: fixed update service redirect handling 2016-08-16 08:40:39 -07:00
Glenn Glazer 7ed9c85a1a SL-323: fixes to Tkinter race condition, post --channel and --settings testing, contains debugging statements to be removed after all testing complete 2016-08-15 14:48:09 -07:00
Glenn Glazer 2afcff5b01 SL-321: one more commithook issue in test file 2016-07-28 11:44:01 -07:00
Glenn Glazer 398fabf10c SL-321: fix commithook issues in test files 2016-07-28 11:38:13 -07:00
Glenn Glazer fc7c0645fa SL-321: add in resource files, more CLI handling fixes 2016-07-28 08:50:52 -07:00
Glenn Glazer f44829f2ae SL-321: basic launcher/updater integration test fixes 2016-07-27 15:44:56 -07:00
Glenn Glazer 4428ee77c2 SL-323: make changes to include llbase as an autobuild pkg, undelete files that will be deleted with MAINT-6585 and no need to copy local files in viewer-manifest. 2016-07-21 10:18:58 -07:00
Nat Goodspeed 9c49a6c91d MAINT-5011: Introduce LLException base class for viewer exceptions.
This also introduces LLContinueError for exceptions which should interrupt
some part of viewer processing (e.g. the current coroutine) but should attempt
to let the viewer session proceed.

Derive all existing viewer exception classes from LLException rather than from
std::runtime_error or std::logic_error.

Use BOOST_THROW_EXCEPTION() rather than plain 'throw' to enrich the thrown
exception with source file, line number and containing function.
2016-07-19 16:25:25 -04:00
Glenn Glazer 68832f56ba add dependent modules 2016-07-14 08:37:23 -07:00
Glenn Glazer 58d8b3a11e SL-323: add llsd python module 2016-07-13 17:31:14 -07:00
Glenn Glazer adc67912d0 include manager directory in viewer manifest, not CMake 2016-07-13 09:37:53 -07:00
Glenn Glazer 49b8a1c82d include manager directory in CMake list 2016-07-13 08:19:49 -07:00
Nat Goodspeed b031b1a625 MAINT-5011: Derive remaining exception classes from std::exception.
In particular:
NotImplemented in llhttpnode.cpp
RelocateError in llupdateinstaller.cpp
LLProtectedDataException, LLCertException and subclasses in llsecapi.h

Had to add no-throw destructor overrides to LLCertException and subclasses
because otherwise clang complains that the implicitly-generated destructor's
exception specification is more lax than the base class's.
2016-07-13 10:43:36 -04:00
Glenn Glazer 9c2633cba8 SL-323: adding in unit tests 2016-07-13 07:36:12 -07:00