| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
This fixes the selector optimisation, adding a few write barriers which
are necessary for soundness. See the inline comments for details.
Fixes #22930.
|
|
|
|
|
|
|
|
|
| |
Previously `storageAddCapabilities` (called by `setNumCapabilities`) would
clobber the update remembered sets of existing capabilities when
increasing the capability count. Fix this by only initializing the
update remembered sets of the newly-created capabilities.
Fixes #22927.
|
|
|
|
|
| |
We must conservatively assume that new closures are reachable since we
are not guaranteed to mark such blocks.
|
| |
|
|
|
|
|
| |
Previously we only updated the state of the segment at the head of each
allocator's filled list.
|
| |
|
|
|
|
|
| |
Assert that entries in the nonmoving generation's generational
remembered set (a.k.a. mutable list) live in nonmoving generation.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This fixes an interaction between aging and weak pointer handling which
prevented the finalization of some weak pointers. In particular, weak
pointers could have their keys incorrectly marked by the preparatory
collector, preventing their finalization by the subsequent concurrent
collection.
While in the area, we also significantly improve the assertions
regarding weak pointers.
Fixes #22327.
|
| |
|
| |
|
|
|
|
| |
This makes the intent of this implementation a bit clearer.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
These can be quite expensive and it is sometimes useful to compile a
DEBUG RTS without them.
|
| |
|
| |
|
|
|
|
|
|
|
| |
This patch adds the rts_clearMemory function that does its best to
zero out unused RTS memory for a wasm backend use case. See the
comment above rts_clearMemory() prototype declaration for more
detailed explanation. Closes #22920.
|
|
|
|
|
|
|
|
| |
The MBLOCK_SHIFT macro must be the single source of truth for defining
the mblock size, and changing it should only affect performance, not
correctness. This patch makes it truly possible to reconfigure mblock
size, at least on 32-bit targets, by fixing places which implicitly
relied on the previous MBLOCK_SHIFT constant. Fixes #22901.
|
|
|
|
|
| |
Make the RTS compilable with a C++ compiler by inserting necessary
casts.
|
|
|
|
|
|
|
|
| |
When performing GC without work stealing there was no guarantee that
spark pruning was happening after marking of the sparks. This could
cause us to GC live sparks under certain circumstances.
Fixes #22528.
|
|
|
|
|
|
|
| |
0e274c39bf836d5bb846f5fa08649c75f85326ac added an assertion in
`dirty_MUT_VAR` checking that the MUT_VAR being dirtied was clean.
However, this isn't necessarily the case since another thread may have
raced us to dirty the object.
|
|
|
|
|
|
|
| |
The logic here was inverted. Reverting the commit to avoid confusion
when examining the commit history.
This reverts commit b3eacd64fb36724ed6c5d2d24a81211a161abef1.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On Linux, `pthread_setname_np` (or rather, the kernel) only allows for
thread names up to 16 bytes, including the terminating null byte.
This commit adds a note pointing this out in `createOSThread`, and fixes
up two instances where a thread name of more than 15 characters long was
used (in the RTS, and in a test-case).
Fixes: #22366
Fixes: https://gitlab.haskell.org/ghc/ghc/-/issues/22366
See: https://gitlab.haskell.org/ghc/ghc/-/issues/22366#note_460796
|
|
|
|
| |
Since these may race with the allocator(s).
|
|
|
|
|
| |
We must use an acquire load to read the info table pointer since if we
find an indirection we must be certain that we see the indirectee.
|
|
|
|
|
| |
Relaxed load is fine here since we will take the lock before looking at
the list.
|
|
|
|
|
|
| |
This is a benign race on any sensible hard since these are byte
accesses. Nevertheless, atomic accesses are necessary to satisfy
TSAN.
|
|
|
|
| |
TSAN complains about this sort of thing.
|
|
|
|
|
|
|
| |
This avoids a lock inversion between the storage manager mutex and
the stable pointer table mutex by not dropping the SM_MUTEX in
nonmovingCollect. This requires quite a bit of rejiggering but it
does seem like a better strategy.
|
| |
|
|
|
|
|
|
| |
Mark a number of accesses to do with tracking of the status of the
concurrent collection thread as atomic. No interesting races here,
merely necessary to satisfy TSAN.
|
| |
|
|
|
|
|
|
|
| |
To ensure that we don't race with a mutator entering a new CAF we take
the SM mutex before touching static_flag. The other option here would be
to instead modify newCAF to use a CAS but the present approach is a bit
safer.
|
|
|
|
| |
Since it may have been mutated by a moving GC.
|
| |
|
|
|
|
|
| |
We must use an acquire-fence when marking to ensure that the indirectee
is visible.
|
|
|
|
|
|
|
| |
0e274c39bf836d5bb846f5fa08649c75f85326ac added an assertion in
`dirty_MUT_VAR` checking that the MUT_VAR being dirtied was clean.
However, this isn't necessarily the case since another thread may have
raced us to dirty the object.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
And ensure accesses to n_capabilities are atomic (although with relaxed
ordering). This is necessary as RTS API callers may concurrently call
into the RTS without holding a capability.
|
|
|
|
|
| |
Also introduce MUT_FIELD marker in Closures.h to document mutable
fields.
|
|
|
|
|
| |
The global vars {blocked,sleeping}_queue are now in the Capability and
so get marked there via markCapabilityIOManager.
|
|
|
|
|
| |
This patch makes flushExec a no-op on wasm32, since there's no such
thing as executable memory on wasm32 in the first place.
|
|
|
|
|
|
| |
This patch makes the storage manager not return any memory on wasm32.
The detailed reason is described in Note [Megablock allocator on
wasm].
|