diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2024-02-09 21:21:05 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2024-03-05 14:06:29 +0100 |
commit | d6d224892e6672dc3ed8f027b54277fe8a7971f9 (patch) | |
tree | f30ec487e8b33f972a542ff5b7735940b4515a1e /src/qml/memory/qv4mm_p.h | |
parent | 61d7cf160f750bbef10c770997b839ee3e7c354e (diff) |
Prepare for white allocations during gc (9/9): ExecutableCompilationUnit
ExecutableCompilationUnits are meant to be part of the roots as far as
the gc is concerned. However, they can be created at any point in time,
notably also while the GC is running. This was safe so far because all
allocations are black, and the compilation unit will only reference
freshly allocated heap items. As we want to move away from that pattern,
we have to change this:
We could use the typical combination of QV4::Scope and usage of the
WriteBarrier, however that would add overhead for a very uncommon case
(except when using QV4_MM_AGGRESSIVE_GC). Instead, we temporarily block
the garbage collection, reset the state of an ongoing garbage collection
and at the end of the setup of the ExecutableCompilationUnit, we mark
the ExecutableCompilationUnit if the GC was already running.
Introduce a new blocked state (CriticalSection) to distinguish between
the normal blocked state (gc is running) and the new state where we must
not even run an incremental gc to completion until the section has
finished.
Task-number: QTBUG-121910
Change-Id: I1dba3cc8a4f8d2b741a1a5e84fdfe7736b08e166
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/memory/qv4mm_p.h')
-rw-r--r-- | src/qml/memory/qv4mm_p.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/qml/memory/qv4mm_p.h b/src/qml/memory/qv4mm_p.h index 9ed5b946b7..74aa0b639f 100644 --- a/src/qml/memory/qv4mm_p.h +++ b/src/qml/memory/qv4mm_p.h @@ -414,7 +414,9 @@ public: std::size_t unmanagedHeapSizeGCLimit; std::size_t usedSlotsAfterLastFullSweep = 0; - bool gcBlocked = false; + enum Blockness : quint8 {Unblocked, NormalBlocked, InCriticalSection }; + + Blockness gcBlocked = Unblocked; bool aggressiveGC = false; bool gcStats = false; bool gcCollectorStats = false; |