<feed xmlns='http://www.w3.org/2005/Atom'>
<title>viewer.git/indra/llcommon/workqueue.h, branch cef_147</title>
<subtitle>Megapahit's fork of the Second Life viewer.
</subtitle>
<id>https://www.megapahit.org/viewer.git/atom?h=cef_147</id>
<link rel='self' href='https://www.megapahit.org/viewer.git/atom?h=cef_147'/>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/'/>
<updated>2026-04-07T23:18:44Z</updated>
<entry>
<title>Release/26.1.1 (#5530)</title>
<updated>2026-04-07T23:18:44Z</updated>
<author>
<name>Jonathan "Geenz" Goodman</name>
<email>geenz@lindenlab.com</email>
</author>
<published>2026-04-07T23:12:59Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=46412a6bfcf232790b9a57931d3efafcbf758511'/>
<id>urn:sha1:46412a6bfcf232790b9a57931d3efafcbf758511</id>
<content type='text'>
* Integrate Velopack installer and update framework

* Add Velopack update support for macOS and VVM integration

* Update Velopack version and dependencies

* Improve Velopack packaging for macOS

* #5346 Uninstall older non-velopack viewer (#5363)

* #5335 Fix silent uninstall asking about registry

* #5346 Uninstall older non-velopack viewer

* Use runtime viewer exe name, handle Velopack URL

* Velopack download failure diagnostic (#5520)

* Velopack download failure diagnostic

* Fix up velopack downloading updates.  Handle updates internally then hand them off to velopack. (#5524)

* More velopack changes.  Should download updates properly now.

* Don't include NSI files

* Restore optional updates, refine viewer restart behavior. (#5527)

* Add support for optional updates.

* Don't restart the viewer after the update unless it was optional.

* Setup UpdaterServiceSetting with velopack properly.

* Refine the restart behavior a bit - readd the old "the viewer must update" UX.

* If the update is still downloading, close should just reopen the downloading dialog.

---------

Co-authored-by: Jonathan "Geenz" Goodman &lt;geenz@lindenlab.com&gt;

* Remove SLVersionChecker from the viewer with velopack. (#5528)

* Remove SLVersionChecker updater integration

* Ensure that the portable install has the correct version number.

* Don't produce shortcuts with VPK - we do this with our post install.

* Bump viewer version from 26.1.0 to 26.1.1

* Potential fix for uninstaller not being functional.

* Fix for UpdaterServiceSetting being ignored.

* Filter for release channel when generating shortcuts.

* Add some more logging for icons on Windows builds.

* More VPK logging.

* Move velopack packaging in CI to the sign and package step.

* Enable velopack downgrade and skip older updates

* Move the version required checking into velopack's checks.

* Potential fix for downgrade prompts.

* Make sure our macOS flow mirrors Windows.

* Make sure to use the dev version of the mac sign and package.

* p#553 Only one of two uninstallers displayed

* #5346 Don't force user to shutdown velopack build for NSIS uninstall

* #5346 Ignore option for the uninstall dialog

* #5346 Fix early exit crash

* #5346 Properly reset version flag.

* Add some autodetect logic on macOS.

* p#564 Clear legacy links

* p#553 Handle uninstall records

* p#549 Permit testing release notes on a test build

* p#564 Remake nsis to velopack update flow

* p#564 Remake nsis to velopack update flow #2

* p#564 Fix incorrect value type

* p#553 Clear velopack's own registry entry in favor of a custom one

* #5346 Resolve duplicated window class name

* Bump to 2.1.0 of sign and package.

---------

Co-authored-by: Andrey Kleshchev &lt;117672381+akleshchev@users.noreply.github.com&gt;
</content>
</entry>
<entry>
<title>#3612 Log issues with landmarks and rethrown exceptions</title>
<updated>2025-12-21T13:17:47Z</updated>
<author>
<name>Andrey Kleshchev</name>
<email>117672381+akleshchev@users.noreply.github.com</email>
</author>
<published>2025-12-20T11:51:31Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=f57c934676a928e84ae3af55b4886076decca2fc'/>
<id>urn:sha1:f57c934676a928e84ae3af55b4886076decca2fc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>#3918 Implement automatic shutdown for WorkQueueBase</title>
<updated>2025-04-23T15:56:27Z</updated>
<author>
<name>Andrey Lihatskiy</name>
<email>alihatskiy@productengine.com</email>
</author>
<published>2025-04-22T22:27:32Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=ec6c988bbbc59aed218d3629bf0c13192f6b726c'/>
<id>urn:sha1:ec6c988bbbc59aed218d3629bf0c13192f6b726c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Give control over thread queue's automatic shutdown</title>
<updated>2025-04-10T21:13:19Z</updated>
<author>
<name>Andrey Kleshchev</name>
<email>andreykproductengine@lindenlab.com</email>
</author>
<published>2024-10-31T00:30:54Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=9117a37c3d1bd9741e599b60fdf000f9f174f72a'/>
<id>urn:sha1:9117a37c3d1bd9741e599b60fdf000f9f174f72a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>#824 Process source files in bulk: replace tabs with spaces, convert CRLF to LF, and trim trailing whitespaces as needed</title>
<updated>2024-04-29T04:56:09Z</updated>
<author>
<name>Andrey Lihatskiy</name>
<email>alihatskiy@productengine.com</email>
</author>
<published>2024-04-29T04:43:28Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=1b68f71348ecf3983b76b40d7940da8377f049b7'/>
<id>urn:sha1:1b68f71348ecf3983b76b40d7940da8377f049b7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>SL-19690: Properly qualify exception type.</title>
<updated>2023-05-08T16:31:57Z</updated>
<author>
<name>Nat Goodspeed</name>
<email>nat@lindenlab.com</email>
</author>
<published>2023-05-08T16:31:57Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=d75ecde69c1289f4e3df8b75e9a74c5b05db318c'/>
<id>urn:sha1:d75ecde69c1289f4e3df8b75e9a74c5b05db318c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>SL-19690: Follow up on Rye Mutt's fix for shutdown crashes.</title>
<updated>2023-05-08T16:07:31Z</updated>
<author>
<name>Nat Goodspeed</name>
<email>nat@lindenlab.com</email>
</author>
<published>2023-05-08T16:07:31Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=026ef1935dbdb21ab79159d38fb78e126dd6ac95'/>
<id>urn:sha1:026ef1935dbdb21ab79159d38fb78e126dd6ac95</id>
<content type='text'>
Rather than continuing to propagate try/catch (Closed)
(aka LLThreadSafeQueueInterrupt) constructs through the code base, make
WorkQueueBase::post() return bool indicating success (i.e. ! isClosed()).
This obviates postIfOpen(), which no one was using anyway.

In effect, postIfOpen() is renamed post(), bypassing the exception when
isClosed().

Review existing try/catch blocks of that sort, changing to test for post()
returning false.
</content>
</entry>
<entry>
<title>Fix LLThreadSafeQueueInterrupt in WorkQueueBase::postTo during shutdown by catching and returning false</title>
<updated>2023-05-05T21:23:29Z</updated>
<author>
<name>Rye Mutt</name>
<email>rye@alchemyviewer.org</email>
</author>
<published>2023-05-05T21:23:29Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=855cae27ccde4896509e3e22c68c441d6404ccfb'/>
<id>urn:sha1:855cae27ccde4896509e3e22c68c441d6404ccfb</id>
<content type='text'>
</content>
</entry>
<entry>
<title>DRTVWR-559: Fix broken workqueue_test.cpp.</title>
<updated>2022-12-14T01:49:01Z</updated>
<author>
<name>Nat Goodspeed</name>
<email>nat@lindenlab.com</email>
</author>
<published>2022-12-14T01:49:01Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=424d3ef83cdb354e66789f22f65394f4db523128'/>
<id>urn:sha1:424d3ef83cdb354e66789f22f65394f4db523128</id>
<content type='text'>
Apparently Visual Studio and Xcode disagree on the intended lifespan of a
certain temporary expression. Capturing it in a named variable works.
</content>
</entry>
<entry>
<title>SL-18809: Add WorkSchedule; remove timestamps from WorkQueue.</title>
<updated>2022-12-09T18:21:45Z</updated>
<author>
<name>Nat Goodspeed</name>
<email>nat@lindenlab.com</email>
</author>
<published>2022-12-09T18:21:45Z</published>
<link rel='alternate' type='text/html' href='https://www.megapahit.org/viewer.git/commit/?id=fc424a0db90fd2d2e44e85a19750ad6eaa57b28a'/>
<id>urn:sha1:fc424a0db90fd2d2e44e85a19750ad6eaa57b28a</id>
<content type='text'>
For work queues that don't need timestamped tasks, eliminate the overhead of a
priority queue ordered by timestamp. Timestamped task support moves to
WorkSchedule. WorkQueue is a simpler queue that just waits for work.

Both WorkQueue and WorkSchedule can be accessed via new WorkQueueBase API. Of
course the WorkQueueBase API doesn't deal with timestamps, but a WorkSchedule
can be accessed directly to post timestamped tasks and then handled normally
(e.g. by ThreadPool) to run them.

Most ThreadPool functionality migrates to new ThreadPoolBase class, with
template subclass ThreadPoolUsing&lt;WorkQueue&gt; or ThreadPoolUsing&lt;WorkSchedule&gt;
depending on need. ThreadPool is now an alias for ThreadPoolUsing&lt;WorkQueue&gt;.
Importantly, ThreadPoolUsing::getQueue() delivers a reference to the specific
queue subclass type, so you can post timestamped tasks on a queue retrieved
from ThreadPoolUsing&lt;WorkSchedule&gt;::getQueue().

Since ThreadPool is no longer a simple class but an alias for a particular
template specialization, introduce threadpool_fwd.h to forward-declare it.

Recast workqueue_test.cpp to exercise WorkSchedule, since some of the tests
are time-based. A future todo would be to exercise each applicable test with
both WorkQueue and WorkSchedule.
</content>
</entry>
</feed>
