Merge pull request #197010 from tpwrules/disable-qt-cache
This commit is contained in:
commit
fad5f168d2
@ -1131,6 +1131,19 @@
|
||||
Add udev rules for the Teensy family of microcontrollers.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
The Qt QML disk cache is now disabled by default. This fixes a
|
||||
long-standing issue where updating Qt/KDE apps would sometimes
|
||||
cause them to crash or behave strangely without explanation.
|
||||
Those concerned about the small (~10%) performance hit to
|
||||
application startup can re-enable the cache (and expose
|
||||
themselves to gremlins) by setting the envrionment variable
|
||||
<literal>QML_FORCE_DISK_CACHE</literal> to
|
||||
<literal>1</literal> using e.g. the
|
||||
<literal>environment.sessionVariables</literal> NixOS option.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
systemd-oomd is enabled by default. Depending on which systemd
|
||||
|
@ -342,6 +342,14 @@ Available as [services.patroni](options.html#opt-services.patroni.enable).
|
||||
|
||||
- Add udev rules for the Teensy family of microcontrollers.
|
||||
|
||||
- The Qt QML disk cache is now disabled by default. This fixes a
|
||||
long-standing issue where updating Qt/KDE apps would sometimes cause
|
||||
them to crash or behave strangely without explanation. Those concerned
|
||||
about the small (~10%) performance hit to application startup can
|
||||
re-enable the cache (and expose themselves to gremlins) by setting the
|
||||
envrionment variable `QML_FORCE_DISK_CACHE` to `1` using e.g. the
|
||||
`environment.sessionVariables` NixOS option.
|
||||
|
||||
- systemd-oomd is enabled by default. Depending on which systemd units have
|
||||
`ManagedOOMSwap=kill` or `ManagedOOMMemoryPressure=kill`, systemd-oomd will
|
||||
SIGKILL all the processes under the appropriate descendant cgroups when the
|
||||
|
@ -269,20 +269,5 @@ in
|
||||
# To enable user switching, allow sddm to allocate TTYs/displays dynamically.
|
||||
services.xserver.tty = null;
|
||||
services.xserver.display = null;
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
# Prior to Qt 5.9.2, there is a QML cache invalidation bug which sometimes
|
||||
# strikes new Plasma 5 releases. If the QML cache is not invalidated, SDDM
|
||||
# will segfault without explanation. We really tore our hair out for awhile
|
||||
# before finding the bug:
|
||||
# https://bugreports.qt.io/browse/QTBUG-62302
|
||||
# We work around the problem by deleting the QML cache before startup.
|
||||
# This was supposedly fixed in Qt 5.9.2 however it has been reported with
|
||||
# 5.10 and 5.11 as well. The initial workaround was to delete the directory
|
||||
# in the Xsetup script but that doesn't do anything.
|
||||
# Instead we use tmpfiles.d to ensure it gets wiped.
|
||||
# This causes a small but perceptible delay when SDDM starts.
|
||||
"e ${config.users.users.sddm.home}/.cache - - - 0"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
@ -81,7 +81,11 @@ let
|
||||
sha256 = "0crkw3j1iwdc1pbf5dhar0b4q3h5gs2q1sika8m12y02yk3ns697";
|
||||
})
|
||||
];
|
||||
qtdeclarative = [ ./qtdeclarative.patch ];
|
||||
qtdeclarative = [
|
||||
./qtdeclarative.patch
|
||||
# prevent headaches from stale qmlcache data
|
||||
./qtdeclarative-default-disable-qmlcache.patch
|
||||
];
|
||||
qtlocation = [ ./qtlocation-gcc-9.patch ];
|
||||
qtscript = [ ./qtscript.patch ];
|
||||
qtserialport = [ ./qtserialport.patch ];
|
||||
|
@ -0,0 +1,40 @@
|
||||
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
|
||||
index 9e5bc0b0..9219def6 100644
|
||||
--- a/src/qml/qml/qqmltypeloader.cpp
|
||||
+++ b/src/qml/qml/qqmltypeloader.cpp
|
||||
@@ -2151,7 +2151,7 @@ void QQmlTypeData::unregisterCallback(TypeDataCallback *callback)
|
||||
|
||||
bool QQmlTypeData::tryLoadFromDiskCache()
|
||||
{
|
||||
- if (disableDiskCache() && !forceDiskCache())
|
||||
+ if (!forceDiskCache())
|
||||
return false;
|
||||
|
||||
if (isDebugging())
|
||||
@@ -2658,7 +2658,7 @@ void QQmlTypeData::compile(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCach
|
||||
return;
|
||||
}
|
||||
|
||||
- const bool trySaveToDisk = (!disableDiskCache() || forceDiskCache()) && !m_document->jsModule.debugMode && !typeRecompilation;
|
||||
+ const bool trySaveToDisk = (forceDiskCache()) && !m_document->jsModule.debugMode && !typeRecompilation;
|
||||
if (trySaveToDisk) {
|
||||
QString errorString;
|
||||
if (m_compiledData->saveToDisk(url(), &errorString)) {
|
||||
@@ -3014,7 +3014,7 @@ QQmlRefPointer<QQmlScriptData> QQmlScriptBlob::scriptData() const
|
||||
|
||||
void QQmlScriptBlob::dataReceived(const SourceCodeData &data)
|
||||
{
|
||||
- if (!disableDiskCache() || forceDiskCache()) {
|
||||
+ if (forceDiskCache()) {
|
||||
QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit = QV4::Compiler::Codegen::createUnitForLoading();
|
||||
QString error;
|
||||
if (unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) {
|
||||
@@ -3077,7 +3077,7 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data)
|
||||
qmlGenerator.generate(irUnit);
|
||||
}
|
||||
|
||||
- if ((!disableDiskCache() || forceDiskCache()) && !isDebugging()) {
|
||||
+ if ((forceDiskCache()) && !isDebugging()) {
|
||||
QString errorString;
|
||||
if (unit->saveToDisk(url(), &errorString)) {
|
||||
QString error;
|
@ -68,7 +68,11 @@ let
|
||||
./qtbase.patch.d/0010-qtbase-assert.patch
|
||||
./qtbase.patch.d/0011-fix-header_module.patch
|
||||
];
|
||||
qtdeclarative = [ ./qtdeclarative.patch ];
|
||||
qtdeclarative = [
|
||||
./qtdeclarative.patch
|
||||
# prevent headaches from stale qmlcache data
|
||||
./qtdeclarative-default-disable-qmlcache.patch
|
||||
];
|
||||
qtlocation = [ ./qtlocation-gcc-9.patch ];
|
||||
qtscript = [ ./qtscript.patch ];
|
||||
qtserialport = [ ./qtserialport.patch ];
|
||||
|
@ -0,0 +1,13 @@
|
||||
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
|
||||
index 6c12de92..fc67dc07 100644
|
||||
--- a/src/qml/qml/qqmltypeloader.cpp
|
||||
+++ b/src/qml/qml/qqmltypeloader.cpp
|
||||
@@ -705,7 +705,7 @@ bool QQmlTypeLoader::Blob::isDebugging() const
|
||||
|
||||
bool QQmlTypeLoader::Blob::diskCacheEnabled() const
|
||||
{
|
||||
- return (!disableDiskCache() || forceDiskCache()) && !isDebugging();
|
||||
+ return (forceDiskCache()) && !isDebugging();
|
||||
}
|
||||
|
||||
bool QQmlTypeLoader::Blob::qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &data, QList<QQmlError> *errors)
|
@ -56,7 +56,11 @@ let
|
||||
./qtbase.patch.d/0010-qtbase-assert.patch
|
||||
./qtbase.patch.d/0011-fix-header_module.patch
|
||||
];
|
||||
qtdeclarative = [ ./qtdeclarative.patch ];
|
||||
qtdeclarative = [
|
||||
./qtdeclarative.patch
|
||||
# prevent headaches from stale qmlcache data
|
||||
./qtdeclarative-default-disable-qmlcache.patch
|
||||
];
|
||||
qtscript = [ ./qtscript.patch ];
|
||||
qtserialport = [ ./qtserialport.patch ];
|
||||
qtwebengine = lib.optionals stdenv.isDarwin [
|
||||
|
@ -0,0 +1,13 @@
|
||||
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
|
||||
index 1d66e75..827567a 100644
|
||||
--- a/src/qml/qml/qqmltypeloader.cpp
|
||||
+++ b/src/qml/qml/qqmltypeloader.cpp
|
||||
@@ -727,7 +727,7 @@ bool QQmlTypeLoader::Blob::isDebugging() const
|
||||
|
||||
bool QQmlTypeLoader::Blob::diskCacheEnabled() const
|
||||
{
|
||||
- return (!disableDiskCache() && !isDebugging()) || forceDiskCache();
|
||||
+ return forceDiskCache();
|
||||
}
|
||||
|
||||
bool QQmlTypeLoader::Blob::qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &data, QList<QQmlError> *errors)
|
@ -16,6 +16,10 @@ qtModule {
|
||||
"-DQT6_INSTALL_PREFIX=${placeholder "out"}"
|
||||
"-DQT_INSTALL_PREFIX=${placeholder "out"}"
|
||||
];
|
||||
patches = [
|
||||
# prevent headaches from stale qmlcache data
|
||||
../patches/qtdeclarative-default-disable-qmlcache.patch
|
||||
];
|
||||
postInstall = ''
|
||||
substituteInPlace "$out/lib/cmake/Qt6Qml/Qt6QmlMacros.cmake" \
|
||||
--replace ''\'''${QT6_INSTALL_PREFIX}' "$dev"
|
||||
|
@ -0,0 +1,13 @@
|
||||
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
|
||||
index 852cde9e..165f1b57 100644
|
||||
--- a/src/qml/jsruntime/qv4engine.cpp
|
||||
+++ b/src/qml/jsruntime/qv4engine.cpp
|
||||
@@ -2093,7 +2093,7 @@ void ExecutionEngine::registerModule(const QString &_name, const QJSValue &modul
|
||||
|
||||
bool ExecutionEngine::diskCacheEnabled() const
|
||||
{
|
||||
- return (!disableDiskCache() && !debugger()) || forceDiskCache();
|
||||
+ return forceDiskCache();
|
||||
}
|
||||
|
||||
void ExecutionEngine::callInContext(QV4::Function *function, QObject *self,
|
Loading…
Reference in New Issue
Block a user