Fix freeze/deadlock after aborted pragma #3742
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is a proposed fix for #3741.
(I stumbled upon this when using
pragma legacy_alter_table=1
as a workaround for #1686, after I had added a few rows to a table.)When saving, the GUI thread blocks on
DBBrowserDB::waitForDbRelease
line 847, where it waits fordb_used
to becomefalse
. This must be done by~db_pointer_type
(DatabaseReleaser
).In
RunSql::executeNextStatement
this deleter is normally invoked byRunSql::releaseDbAccess
, but in the case of a pragma statement on a dirty DB, the function exits early (line 140) without callingreleaseDbAccess
. This creates a deadlock, asdb_used
is never set tofalse
- thus hindering the GUI thread from accepting any user input.Calling the aforementioned method before returning resolved the issue for me. I'm neither familiar with the
sqlitebrowser
codebase nor with C++ in general, so this probably isn't the best solution.