aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
diff options
context:
space:
mode:
Diffstat (limited to 'AGENTS.md')
-rw-r--r--AGENTS.md14
1 files changed, 14 insertions, 0 deletions
diff --git a/AGENTS.md b/AGENTS.md
index e089254..ca862dd 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -402,6 +402,20 @@ changing that component. The ones that generalise:
is not a function`, which shows only in `qs log`; a Repeater bound to it
simply builds nothing. Use `reduce((a, x) => a.concat(...), [])`. Seen
with the assistant page's cloud Prefer rows (2026-10-23).
+- **Canvas `createImageData` breaks Qt's garbage collector for good.** Qt
+ 6.11 subtracts the pixel buffer from the V4 engine's unmanaged-heap counter
+ without ever having added it, so the first GC after one is created wraps
+ the `size_t` counter below zero, and from then on every JS allocation runs
+ a full GC: a core pinned, keybinds and the drawer lagging, until a
+ restart. Reproduced in Qt's own `qml` tool with nothing but a `Canvas`
+ (17,856 of 17,856 GCs wrapped; the same canvas drawing with `fillRect`, 0
+ of 5). The volume OSD's grain did it on every show, which is why the
+ desktop shell spun after volume keys, track changes and resumes alike.
+ `QV4_GC_TIMELIMIT=0`, set earlier for a misdiagnosed "stuck incremental
+ GC", does not help. Never use `createImageData`, `getImageData` or
+ `putImageData`. Found by running each always-on unit in its own `qs` with
+ `--log-rules qt.qml.gc.allocatorStats.debug=true` and reading the
+ unmanaged counter after each GC.
- **A `Socket` whose connect failed never retries.** Quickshell 0.3.1 keeps
the failed `QLocalSocket`, so setting `connected = true` again (or toggling
it, or changing `path`) is a no-op: `setConnected` only connects when no