<table><tr><td style="">rkflx created this revision.<br />Restricted Application added a project: Okular.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D7595" rel="noreferrer">View Revision</a></tr></table><br /><div><strong>REVISION SUMMARY</strong><div><p>When pressing and holding <kbd style="display: inline-block; min-width: 1em; padding: 4px 5px 5px; font-weight: normal; font-size: 0.8rem; text-align: center; text-decoration: none; line-height: 0.6rem; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(71, 87, 120, 0.08); user-select: none; background: #f7f7f7; border: 1px solid #C7CCD9;">F5</kbd>, Okular would reload the current<br />
document multiple times and eventually get stuck with no document<br />
showing and the "Reloading the document..." message reappearing every<br />
second in an infinite loop. On exit, Okular then would sometimes<br />
segfault, although often in different lines of code.</p>

<p>These issues can be avoided by only allowing one reload progressing at<br />
any time. Any further reload requests are discarded.</p>

<p>Implementation:</p>

<ul class="remarkup-list">
<li class="remarkup-list-item">use std::unique_lock, as QMutexLocker lacks support for try_lock</li>
<li class="remarkup-list-item">use std::mutex, as QMutex supports try_lock only since Qt 5.8</li>
</ul>

<p>Note: The "Reload" menu entry and shortcut are already disabled while<br />
fetching the document (most noticable when using a slow network link).<br />
The new lock protects against *overlapping* reload requests coming in<br />
after fetching completes but before rendering finishes.</p>

<p>Thanks to <a href="https://phabricator.kde.org/p/aacid/" style="
              border-color: #f1f7ff;
              color: #19558d;
              background-color: #f1f7ff;
                border: 1px solid transparent;
                border-radius: 3px;
                font-weight: bold;
                padding: 0 4px;" rel="noreferrer">@aacid</a> for finding the fix, this merely improves the<br />
implementation by using a mutex with RAII instead of a non-atomic and<br />
non-dry boolean.</p></div></div><br /><div><strong>TEST PLAN</strong><div><ul class="remarkup-list">
<li class="remarkup-list-item">Builds with both GCC 4.8 / Qt 5.6 and GCC 7.1 / Qt 5.9.</li>
<li class="remarkup-list-item">No hiccups and crashes anymore when holding <kbd style="display: inline-block; min-width: 1em; padding: 4px 5px 5px; font-weight: normal; font-size: 0.8rem; text-align: center; text-decoration: none; line-height: 0.6rem; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(71, 87, 120, 0.08); user-select: none; background: #f7f7f7; border: 1px solid #C7CCD9;">F5</kbd>.</li>
<li class="remarkup-list-item">Behaviour for slow downloading remote documents unchanged.</li>
</ul></div></div><br /><div><strong>REPOSITORY</strong><div><div>R223 Okular</div></div></div><br /><div><strong>BRANCH</strong><div><div>reload-mutex (branched from Applications/17.08)</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D7595" rel="noreferrer">https://phabricator.kde.org/D7595</a></div></div><br /><div><strong>AFFECTED FILES</strong><div><div>part.cpp<br />
part.h</div></div></div><br /><div><strong>To: </strong>rkflx, Okular<br /><strong>Cc: </strong>aacid<br /></div>