Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incremental GC Barriers #3831

Merged
merged 684 commits into from May 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
684 commits
Select commit Hold shift + click to select a range
f7b3dd5
Adjust test
luc-blaeser Jan 26, 2023
ff0bea6
Update benchmark results
luc-blaeser Jan 26, 2023
0510e5a
Revert test run
luc-blaeser Jan 26, 2023
f1ca154
Bug fix
luc-blaeser Jan 26, 2023
fd3e13a
Adjust test
luc-blaeser Jan 26, 2023
994a9ac
Adjust tests
luc-blaeser Jan 26, 2023
60f60fd
Code refactoring
luc-blaeser Jan 26, 2023
0e6c263
Selective memory checks
luc-blaeser Jan 26, 2023
6891ed0
Revert "Selective memory checks"
luc-blaeser Jan 26, 2023
26872cb
Make timer tests less time-dependent
luc-blaeser Jan 26, 2023
fe2880f
Revert test run
luc-blaeser Jan 26, 2023
16d1022
Remove allocation increment again
luc-blaeser Jan 27, 2023
a507eff
GC tuning
luc-blaeser Jan 27, 2023
58e58ca
Merge branch 'master' into luc/incremental-gc
luc-blaeser Jan 27, 2023
008f2b8
Optimization
luc-blaeser Jan 27, 2023
a146ffa
Bug fix
luc-blaeser Jan 27, 2023
6f4dd99
Revert "Bug fix"
luc-blaeser Jan 27, 2023
9009fbb
GC tuning
luc-blaeser Jan 27, 2023
9d4fa63
Merge branch 'master' into luc/incremental-gc
luc-blaeser Jan 30, 2023
36db146
GC tuning
luc-blaeser Jan 30, 2023
a4c1341
Reintroduce allocation increment
luc-blaeser Jan 30, 2023
49bde61
GC tuning, phase changes in allocation increments
luc-blaeser Jan 30, 2023
5bb7d60
GC tuning
luc-blaeser Jan 30, 2023
7cc5592
GC tuning
luc-blaeser Jan 30, 2023
0ec6edf
GC tuning
luc-blaeser Jan 30, 2023
ba7a146
GC tuning
luc-blaeser Jan 30, 2023
fed433d
Merge branch 'master' into luc/incremental-gc
luc-blaeser Jan 30, 2023
aae861b
Split too large test case
luc-blaeser Jan 30, 2023
f0246e1
Downscale test for extensive memory sanity checks
luc-blaeser Jan 30, 2023
6709ff0
GC tuning
luc-blaeser Jan 30, 2023
24d6748
GC tuning
luc-blaeser Jan 31, 2023
e103687
Use RTS compiler option to enable extensive memory checks
luc-blaeser Jan 31, 2023
8b237b4
Include memory free in extensive memory check
luc-blaeser Jan 31, 2023
4f4ae80
Revert test changes
luc-blaeser Jan 31, 2023
33baf4c
Revert "Downscale test for extensive memory sanity checks"
luc-blaeser Jan 31, 2023
b9a06ca
Revert "Make timer tests less time-dependent"
luc-blaeser Jan 31, 2023
49d9a66
Update RTS test for optional extensive memory checks
luc-blaeser Jan 31, 2023
dba9e89
reformat
luc-blaeser Jan 31, 2023
74d2ee3
Cleanup
luc-blaeser Feb 1, 2023
ee76ce1
Cleanup
luc-blaeser Feb 1, 2023
68f2175
Cleanup
luc-blaeser Feb 1, 2023
9bcb58a
Cleanup
luc-blaeser Feb 1, 2023
80d1cf7
Cleanup
luc-blaeser Feb 1, 2023
e8ba9aa
Cleanup
luc-blaeser Feb 1, 2023
846c18b
Cleanup
luc-blaeser Feb 1, 2023
7e80c00
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 1, 2023
a275942
Downscale long running tests
luc-blaeser Feb 1, 2023
4814e5d
Make timer tests more robust (less time-dependent)
luc-blaeser Feb 1, 2023
68d7512
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 2, 2023
658eda4
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 2, 2023
ad96a01
Merge branch 'luc/incremental-gc' of https://github.com/dfinity/motok…
luc-blaeser Feb 2, 2023
97422b7
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 3, 2023
37ac8a4
Comment fix
luc-blaeser Feb 3, 2023
0bc1ba5
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 3, 2023
7252c66
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 3, 2023
8ccdd59
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 6, 2023
58467e6
Revert "Split too large test case"
luc-blaeser Feb 6, 2023
e59e0d6
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 8, 2023
94dd48d
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 8, 2023
381beb4
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 9, 2023
f485761
Update benchmark results
luc-blaeser Feb 9, 2023
772d216
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 10, 2023
eddd3fe
Group static GC state
luc-blaeser Feb 10, 2023
5945e97
Reference state as parameter
luc-blaeser Feb 12, 2023
71d2beb
Safe borrow checking for static state
luc-blaeser Feb 12, 2023
3a66153
Update benchmark results
luc-blaeser Feb 12, 2023
ec46545
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 14, 2023
37fabab
Merging allocator fast path changes
luc-blaeser Feb 14, 2023
cb7dc87
Add mark bitmap
luc-blaeser Feb 14, 2023
ee4f2ce
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 15, 2023
ab9b451
Adjust for merged changes
luc-blaeser Feb 15, 2023
5ecb89d
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 15, 2023
6170e78
Change to mark bitmap
luc-blaeser Feb 15, 2023
d8d64b2
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 16, 2023
b3bb7e1
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 16, 2023
6a9ab0b
Adjust tests and large allocation handling
luc-blaeser Feb 16, 2023
ac01d70
Adjust RTS trap message
luc-blaeser Feb 16, 2023
db518f4
Revert "Adjust RTS trap message"
luc-blaeser Feb 16, 2023
77cb5b1
Adjust RTS message
luc-blaeser Feb 16, 2023
adc4635
Adjust RTS message
luc-blaeser Feb 16, 2023
5955c8d
Revert change in test run
luc-blaeser Feb 16, 2023
572c442
Match RTS trap message when out of memory
luc-blaeser Feb 16, 2023
fa48db3
Adjust tests with exact heap trace
luc-blaeser Feb 16, 2023
1d3bf24
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 16, 2023
8d62b50
Optimize large object marking
luc-blaeser Feb 16, 2023
cf72550
Fix live set calculation
luc-blaeser Feb 16, 2023
f66cc3b
Fix live set calculation
luc-blaeser Feb 16, 2023
1f22272
Adjust switching allocation partitions on GC run
luc-blaeser Feb 16, 2023
921dccb
Bug fix, resuming finished partition iteration
luc-blaeser Feb 16, 2023
b84310d
Refactor partitioned heap iteration
luc-blaeser Feb 16, 2023
9e33260
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 20, 2023
1fd77d3
Adjust test for merged changes
luc-blaeser Feb 20, 2023
9f73950
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 20, 2023
e7f5aa2
Temporarily disable base library tests
luc-blaeser Feb 21, 2023
80c0bff
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 21, 2023
c5f78d5
Update ic-ref-run test result for timer
luc-blaeser Feb 21, 2023
fd300b0
Update ic-ref-run test result for timer
luc-blaeser Feb 21, 2023
4a7ad7d
Bug fix
luc-blaeser Feb 21, 2023
c5ca7d6
Adjust test for incremental GC
luc-blaeser Feb 21, 2023
3c6c636
Adjust test for incremental GC
luc-blaeser Feb 21, 2023
efbd2a0
Adjust sanity checks
luc-blaeser Feb 21, 2023
6c855a9
Adjust memory sanity check for mark bitmap
luc-blaeser Feb 21, 2023
642ecce
Adjust timer test
luc-blaeser Feb 21, 2023
de6d49c
Remove mark bit
luc-blaeser Feb 21, 2023
583b1ad
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 21, 2023
6fc9957
Adjust debug assertion
luc-blaeser Feb 21, 2023
c6e056f
Optimization
luc-blaeser Feb 21, 2023
8d11444
Reformat
luc-blaeser Feb 21, 2023
ab4bc68
Merge branch 'master' into luc/incremental-gc
luc-blaeser Feb 22, 2023
eabf763
Merge branch 'luc/incremental-gc' into luc/incremental-mark-bitmap
luc-blaeser Feb 22, 2023
7f1975a
Remove option for mark bitmap
luc-blaeser Feb 22, 2023
5e8b4d8
Optimization: Removing option for partitioned heap
luc-blaeser Feb 22, 2023
4c89aee
Adjust comment
luc-blaeser Feb 22, 2023
a22018a
Code refactoring
luc-blaeser Feb 22, 2023
54d0334
Barrier optimization
luc-blaeser Feb 22, 2023
075e579
Bug fix
luc-blaeser Feb 22, 2023
a1dfb7e
Pause tuning
luc-blaeser Feb 22, 2023
6dbaf33
GC tuning
luc-blaeser Feb 22, 2023
5f9b48a
Adjust comment
luc-blaeser Feb 23, 2023
fef39be
Update benchmark
luc-blaeser Feb 23, 2023
fb4fcc0
Adjust test for different stack frame sizes
luc-blaeser Feb 23, 2023
96b1ecb
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Feb 23, 2023
a5eaaf6
Remove forwarding pointer test logic
luc-blaeser Feb 23, 2023
c7caef6
Adjust merge
luc-blaeser Feb 23, 2023
77b9277
Adjust merge with generational GC
luc-blaeser Feb 23, 2023
2d4af15
Remove forwarding pointer sanity check logic
luc-blaeser Feb 23, 2023
b5207df
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
7e4c852
Add more forwarding pointer changes
luc-blaeser Feb 23, 2023
7e09745
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
ca39a4b
More forwarding pointer changes
luc-blaeser Feb 23, 2023
fac4442
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
ec820cc
Adjust format and tests
luc-blaeser Feb 23, 2023
37ceebd
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
2e53539
Adjust test result
luc-blaeser Feb 23, 2023
9c86583
Revert unnecessary changes
luc-blaeser Feb 23, 2023
09c81e4
Adjust format
luc-blaeser Feb 23, 2023
19fe816
Reformat
luc-blaeser Feb 23, 2023
f6e31da
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
a16f449
Also use memory check mode for generational GC
luc-blaeser Feb 23, 2023
a2bb7c4
Revert change in run
luc-blaeser Feb 23, 2023
d2c18fe
Adjust comments
luc-blaeser Feb 23, 2023
15102e1
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
b40f1df
Adjust benchmark results
luc-blaeser Feb 23, 2023
3d6c0f6
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
0955b9b
Add missing generational GC ic-ref build
luc-blaeser Feb 23, 2023
831174b
Reenable base test
luc-blaeser Feb 23, 2023
7ec2686
Revert unnecessary changes
luc-blaeser Feb 23, 2023
cb6bb3a
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
196686b
Remove incremental GC implementation
luc-blaeser Feb 23, 2023
40ca7ec
Undo unnecessary changes
luc-blaeser Feb 23, 2023
4dba687
Merge branch 'luc/forwarding_pointer' into luc/incremental-mark-bitmap
luc-blaeser Feb 23, 2023
41d5ad4
Merge branch 'luc/incremental-mark-bitmap' into luc/incremental-prepa…
luc-blaeser Feb 23, 2023
536409e
Remove unnecessary changes
luc-blaeser Feb 23, 2023
268db3e
Adjust test results
luc-blaeser Feb 23, 2023
003bd6b
Temporarily disable base test
luc-blaeser Feb 23, 2023
0f702d3
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Feb 23, 2023
8b4cb08
Reformat
luc-blaeser Feb 23, 2023
d5b8d2b
Adjust test result
luc-blaeser Feb 23, 2023
5298a6a
Adjust test result
luc-blaeser Feb 23, 2023
c9a5651
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Feb 24, 2023
c4f7be0
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Feb 24, 2023
088767c
Make test more stable for generational GC, especially `ic-ref-run`
luc-blaeser Feb 24, 2023
f75cce1
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Feb 28, 2023
736be28
Reenable base tests
luc-blaeser Feb 28, 2023
593f4aa
Update rts/motoko-rts/src/stream.rs
luc-blaeser Feb 28, 2023
2f96966
Unify heap base alignment
luc-blaeser Feb 28, 2023
e21907c
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Feb 28, 2023
70f92a4
Resolve merge conflicts
luc-blaeser Feb 28, 2023
2ed4a94
Adjust test for uniform heap alignment
luc-blaeser Mar 1, 2023
7fd7e97
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 1, 2023
1ac0792
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 1, 2023
d30d9c6
Improving code comment
luc-blaeser Mar 1, 2023
88c9972
Adjust comment
luc-blaeser Mar 1, 2023
e63a76d
Merge branch 'luc/forwarding_pointer' of https://github.com/dfinity/m…
luc-blaeser Mar 1, 2023
a0851d7
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 1, 2023
2f88dff
Improve comment and format
luc-blaeser Mar 2, 2023
eec88df
Bug fix: Consider object moving during allocation increments
luc-blaeser Mar 7, 2023
3586dea
Adjust benchmark results
luc-blaeser Mar 7, 2023
a5058ed
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 7, 2023
cf295f4
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 7, 2023
d2f5d94
Extra forwarding sanity checks for field accesses
luc-blaeser Mar 7, 2023
7e43553
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 7, 2023
d91c28c
Correct comment
luc-blaeser Mar 7, 2023
ce0016a
Stricter forward check (to be relaxed on higher PR)
luc-blaeser Mar 7, 2023
27c946c
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 7, 2023
1b67786
Bug fix in tabulate - and code comments
luc-blaeser Mar 8, 2023
f7f07e5
Rename iterate function
luc-blaeser Mar 8, 2023
2d8d787
Update benchmark result
luc-blaeser Mar 8, 2023
c451d14
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 8, 2023
487a9a3
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 8, 2023
0a9e90c
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 10, 2023
96613d2
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 10, 2023
1b472d6
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 15, 2023
52fb919
Merge variant optimization for forwarding pointers
luc-blaeser Mar 15, 2023
b57e1b5
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 15, 2023
ec59c3a
Adjust mutbox write for allocation increments
luc-blaeser Mar 15, 2023
fbc98d1
Improve comment
luc-blaeser Mar 17, 2023
fd2c35a
Refactor static write barrier elimination
luc-blaeser Mar 17, 2023
2c0f3e5
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 22, 2023
b176e9c
Squashed commit of the following:
luc-blaeser Mar 22, 2023
017b10f
Postpone allocation increments
luc-blaeser Mar 23, 2023
9049280
Update benchmark results
luc-blaeser Mar 23, 2023
d62ea71
Adjust benchmark results
luc-blaeser Mar 23, 2023
ed9b1c5
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 28, 2023
8600573
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 28, 2023
ad1fd57
Additional merge changes: Array index refactoring
luc-blaeser Mar 28, 2023
52935f0
Use two WASM functions for the forwarding check
luc-blaeser Mar 28, 2023
7e2d1cc
Refactor allocation barrier
luc-blaeser Mar 28, 2023
4e8e363
Family of shared functions for heap allocation
luc-blaeser Mar 28, 2023
9497da8
Update benchmark results
luc-blaeser Mar 28, 2023
c1e54ec
Performance optimization
luc-blaeser Mar 31, 2023
e892f2f
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Mar 31, 2023
b677559
Update benchmark results
luc-blaeser Mar 31, 2023
71a1fc1
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Mar 31, 2023
a3e954d
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Apr 5, 2023
9cfef91
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 5, 2023
6ce31fa
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Apr 6, 2023
5b8683c
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 6, 2023
cec6db1
Correct the variable declaration type
luc-blaeser Apr 6, 2023
564d0d7
Refactoring: Reduce double map into a single map
luc-blaeser Apr 6, 2023
e0cd563
Code refactoring
luc-blaeser Apr 6, 2023
41161eb
Code refactoring
luc-blaeser Apr 6, 2023
eee41e9
Code refactoring
luc-blaeser Apr 6, 2023
15aa49b
Code refactoring
luc-blaeser Apr 6, 2023
d5549f8
Adjust tests for forwarding pointer
luc-blaeser Apr 6, 2023
4395b48
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 6, 2023
5bd4da2
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Apr 11, 2023
497baa8
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 11, 2023
59449d5
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Apr 12, 2023
dff7277
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 12, 2023
20a2dba
Reformat
luc-blaeser Apr 12, 2023
a347d5d
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 12, 2023
9fe83ae
Reformat
luc-blaeser Apr 12, 2023
72af011
Revert unnecessary changes
luc-blaeser Apr 12, 2023
033c263
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 12, 2023
0513c82
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser Apr 13, 2023
47d20ee
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser Apr 13, 2023
2159789
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser May 1, 2023
910eb1a
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser May 1, 2023
01c0f8f
Updating nix hashes
github-actions[bot] May 1, 2023
442eb15
Adjust tests for different stack size
luc-blaeser May 1, 2023
98dce2c
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser May 1, 2023
c7ba335
Refactoring: Stack size test cases
luc-blaeser May 1, 2023
b680ecc
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser May 1, 2023
fcb4e94
Revert "Updating nix hashes"
luc-blaeser May 1, 2023
09510f7
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser May 4, 2023
ed82364
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser May 4, 2023
647d517
Merge branch 'master' into luc/forwarding_pointer
luc-blaeser May 10, 2023
0bba417
Merge branch 'luc/forwarding_pointer' into luc/incremental-preparation
luc-blaeser May 10, 2023
d1d204c
Merge branch 'master' into luc/incremental-preparation
luc-blaeser May 12, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion default.nix
Expand Up @@ -382,7 +382,6 @@ rec {
EXTRA_MOC_ARGS = "--sanity-checks --generational-gc";
});


perf_subdir = dir: deps:
(test_subdir dir deps).overrideAttrs (args: {
checkPhase = ''
Expand Down
30 changes: 16 additions & 14 deletions rts/motoko-rts-tests/src/continuation_table.rs
@@ -1,9 +1,12 @@
use std::array::from_fn;

use crate::memory::TestMemory;

use motoko_rts::continuation_table::{
continuation_count, recall_continuation, remember_continuation,
};
use motoko_rts::types::{size_of, Array, Value, Words};
use motoko_rts::memory::alloc_blob;
use motoko_rts::types::{size_of, Array, Blob, Bytes, Value, Words};

pub unsafe fn test() {
println!("Testing continuation table ...");
Expand All @@ -13,36 +16,35 @@ pub unsafe fn test() {
const N: usize = 2000; // >256, to exercise `double_continuation_table`

// Array will be doubled 3 times, so 256 + 512 + 1024 + 2048 = 3840 words, plus each array will
// have an array header.
let mut heap = TestMemory::new(Words(3840 + 4 * size_of::<Array>().to_bytes().as_u32()));
// have an array header. Also add the set of N pointers to empty blobs.
let mut heap = TestMemory::new(Words(
3840 + 4 * size_of::<Array>().to_bytes().as_u32()
+ N as u32 * size_of::<Blob>().to_bytes().as_u32(),
));

let pointers: [Value; N] = from_fn(|_| alloc_blob(&mut heap, Bytes(0)));

let mut references: [u32; N] = [0; N];
for i in 0..N {
references[i] = remember_continuation(
&mut heap,
Value::from_raw(((i as u32) << 2).wrapping_sub(1)),
);
references[i] = remember_continuation(&mut heap, pointers[i]);
assert_eq!(continuation_count(), (i + 1) as u32);
}

for i in 0..N / 2 {
let c = recall_continuation(references[i]);
assert_eq!(c.get_raw(), (i << 2).wrapping_sub(1) as u32);
assert_eq!(c.get_ptr(), pointers[i].get_ptr());
assert_eq!(continuation_count(), (N - i - 1) as u32);
}

for i in 0..N / 2 {
references[i] = remember_continuation(
&mut heap,
Value::from_raw(((i as u32) << 2).wrapping_sub(1)),
);
references[i] = remember_continuation(&mut heap, pointers[i]);
assert_eq!(continuation_count(), (N / 2 + i + 1) as u32);
}

for i in (0..N).rev() {
assert_eq!(
recall_continuation(references[i]).get_raw(),
(i << 2).wrapping_sub(1) as u32,
recall_continuation(references[i]).get_ptr(),
pointers[i].get_ptr(),
);
assert_eq!(continuation_count(), i as u32);
}
Expand Down
4 changes: 3 additions & 1 deletion rts/motoko-rts-tests/src/gc/generational.rs
@@ -1,8 +1,10 @@
mod mark_stack;
mod remembered_set;

pub fn test() {
println!("Testing generational GC components ...");
println!("Testing generational GC ...");
unsafe {
mark_stack::test();
remembered_set::test();
}
}
2 changes: 1 addition & 1 deletion rts/motoko-rts-tests/src/gc/generational/mark_stack.rs
Expand Up @@ -10,7 +10,7 @@ use motoko_rts::types::*;
use proptest::test_runner::{Config, TestCaseError, TestCaseResult, TestRunner};

pub unsafe fn test() {
println!(" Testing generational GC mark stack ...");
println!(" Testing mark stack ...");

test_push_pop();
test_grow_stack();
Expand Down
Expand Up @@ -9,7 +9,7 @@ use motoko_rts::types::{Value, Words};
const GROW_LIMIT: u32 = INITIAL_TABLE_LENGTH * OCCUPATION_THRESHOLD_PERCENT / 100;

pub unsafe fn test() {
println!("Testing remembered set ...");
println!(" Testing remembered set ...");

test_remembered_set(0);
test_remembered_set(1);
Expand All @@ -31,8 +31,6 @@ unsafe fn test_remembered_set(amount: u32) {
}

unsafe fn test_insert_iterate(amount: u32) {
println!(" Testing insert/iterate {amount}");

let mut mem = TestMemory::new(Words(2 * amount + 1024 * 1024));

let mut remembered_set = RememberedSet::new(&mut mem);
Expand All @@ -54,8 +52,6 @@ unsafe fn test_insert_iterate(amount: u32) {
}

unsafe fn test_duplicates(amount: u32) {
println!(" Testing duplicates {amount}");

let mut mem = TestMemory::new(Words(2 * amount + 1024 * 1024));

let mut remembered_set = RememberedSet::new(&mut mem);
Expand All @@ -72,8 +68,6 @@ unsafe fn test_duplicates(amount: u32) {
}

unsafe fn test_collisions(amount: u32) {
println!(" Testing collisions {amount}");

let mut mem = TestMemory::new(Words(2 * amount + 1024 * 1024));

let mut remembered_set = RememberedSet::new(&mut mem);
Expand Down
2 changes: 0 additions & 2 deletions rts/motoko-rts-tests/src/main.rs
Expand Up @@ -7,7 +7,6 @@ mod gc;
mod leb128;
mod memory;
mod principal_id;
mod remembered_set;
mod stream;
mod text;
mod utf8;
Expand All @@ -32,7 +31,6 @@ fn main() {
stream::test();
text::test();
utf8::test();
remembered_set::test();
}
}

Expand Down
7 changes: 7 additions & 0 deletions rts/motoko-rts/Cargo.toml
Expand Up @@ -14,10 +14,17 @@ crate-type = ["staticlib"]
# is used in RTS tests.
default = ["ic"]

# To enable extensive memory sanity checks in the incremental GC, use the
# following default configuration instead:
# default = ["ic", "memory_check"]

# This feature is used to enable stuff needed for the RTS linked with
# moc-generated code, but not when testing the RTS
ic = []

# This feature enables extensive memory sanity checks in the incremental GC.
memory_check = []

[dependencies]
libc = { version = "0.2.139", default_features = false }
motoko-rts-macros = { path = "../motoko-rts-macros" }
Expand Down
2 changes: 2 additions & 0 deletions rts/motoko-rts/src/bigint.rs
Expand Up @@ -32,6 +32,7 @@ This scheme makes the following assumptions:
*/

use crate::buf::{read_byte, Buf};
use crate::gc::incremental::barriers::allocation_barrier;
use crate::mem_utils::memcpy_bytes;
use crate::memory::Memory;
use crate::tommath_bindings::*;
Expand All @@ -50,6 +51,7 @@ unsafe fn mp_alloc<M: Memory>(mem: &mut M, size: Bytes<u32>) -> *mut u8 {
let size = size.as_usize();
debug_assert_eq!((size % core::mem::size_of::<mp_digit>()), 0);
(*blob).mp_int.alloc = (size / core::mem::size_of::<mp_digit>()) as i32;
allocation_barrier(ptr);
blob.payload_addr() as *mut u8
}

Expand Down
9 changes: 6 additions & 3 deletions rts/motoko-rts/src/blob_iter.rs
@@ -1,4 +1,7 @@
use crate::types::{size_of, Array, Bytes, Value, Words, TAG_ARRAY};
use crate::{
gc::incremental::barriers::allocation_barrier,
types::{size_of, Array, Bytes, Value, Words, TAG_ARRAY},
};

use motoko_rts_macros::ic_mem_fn;

Expand All @@ -17,10 +20,10 @@ unsafe fn blob_iter<M: crate::memory::Memory>(mem: &mut M, blob: Value) -> Value
(*iter_array).header.forward = iter_ptr;
(*iter_array).len = 2;

iter_array.set_pointer(ITER_BLOB_IDX, blob, mem);
iter_array.initialize(ITER_BLOB_IDX, blob, mem);
iter_array.set_scalar(ITER_POS_IDX, Value::from_scalar(0));

iter_ptr
allocation_barrier(iter_ptr)
}

/// Returns whether the iterator is finished
Expand Down
9 changes: 4 additions & 5 deletions rts/motoko-rts/src/continuation_table.rs
Expand Up @@ -22,6 +22,7 @@
//! the free list. Since all indices are relative to the payload begin, they stay valid. We never
//! shrink the table.

use crate::gc::incremental::barriers::allocation_barrier;
use crate::memory::{alloc_array, Memory};
use crate::rts_trap_with;
use crate::types::Value;
Expand Down Expand Up @@ -49,6 +50,7 @@ unsafe fn create_continuation_table<M: Memory>(mem: &mut M) {
for i in 0..INITIAL_SIZE {
table.set_scalar(i, Value::from_scalar(i + 1));
}
allocation_barrier(TABLE);
}

unsafe fn double_continuation_table<M: Memory>(mem: &mut M) {
Expand All @@ -64,16 +66,13 @@ unsafe fn double_continuation_table<M: Memory>(mem: &mut M) {

for i in 0..old_size {
let old_value = old_array.get(i);
if old_value.is_ptr() {
new_array.set_pointer(i, old_value, mem);
} else {
new_array.set_scalar(i, old_value);
}
new_array.initialize(i, old_value, mem);
}

for i in old_size..new_size {
new_array.set_scalar(i, Value::from_scalar(i + 1));
}
allocation_barrier(TABLE);
}

pub unsafe fn table_initialized() -> bool {
Expand Down
1 change: 1 addition & 0 deletions rts/motoko-rts/src/gc.rs
@@ -1,5 +1,6 @@
pub mod copying;
pub mod generational;
pub mod incremental;
pub mod mark_compact;

#[cfg(feature = "ic")]
Expand Down
6 changes: 6 additions & 0 deletions rts/motoko-rts/src/gc/copying.rs
Expand Up @@ -5,6 +5,12 @@ use crate::types::*;

use motoko_rts_macros::ic_mem_fn;

#[no_mangle]
#[cfg(feature = "ic")]
pub unsafe extern "C" fn initialize_copying_gc() {
crate::memory::ic::initialize_memory();
}

#[ic_mem_fn(ic_only)]
unsafe fn schedule_copying_gc<M: Memory>(mem: &mut M) {
// Half of the heap.
Expand Down
24 changes: 13 additions & 11 deletions rts/motoko-rts/src/gc/generational.rs
Expand Up @@ -7,7 +7,7 @@

pub mod mark_stack;
pub mod remembered_set;
#[cfg(debug_assertions)]
#[cfg(feature = "memory_check")]
mod sanity_checks;
pub mod write_barrier;

Expand All @@ -27,6 +27,12 @@ use motoko_rts_macros::ic_mem_fn;
use self::mark_stack::{free_mark_stack, pop_mark_stack};
use self::write_barrier::REMEMBERED_SET;

#[ic_mem_fn(ic_only)]
unsafe fn initialize_generational_gc<M: Memory>(mem: &mut M) {
crate::memory::ic::initialize_memory();
write_barrier::init_generational_write_barrier(mem);
}

#[ic_mem_fn(ic_only)]
unsafe fn schedule_generational_gc<M: Memory>(mem: &mut M) {
let limits = get_limits();
Expand All @@ -51,13 +57,10 @@ unsafe fn generational_gc<M: Memory>(mem: &mut M) {
};
let strategy = decide_strategy(&heap.limits);

#[cfg(debug_assertions)]
let forced_gc = strategy.is_none();

let strategy = strategy.unwrap_or(Strategy::Young);
let mut gc = GenerationalGC::new(heap, strategy);

#[cfg(debug_assertions)]
#[cfg(feature = "memory_check")]
sanity_checks::verify_snapshot(&gc.heap, false);

gc.run();
Expand All @@ -67,13 +70,12 @@ unsafe fn generational_gc<M: Memory>(mem: &mut M) {
update_statistics(&old_limits, new_limits);
update_strategy(strategy, new_limits);

#[cfg(debug_assertions)]
if !forced_gc {
luc-blaeser marked this conversation as resolved.
Show resolved Hide resolved
sanity_checks::check_memory(&gc.heap.limits, &gc.heap.roots);
sanity_checks::take_snapshot(&mut gc.heap);
}
#[cfg(feature = "memory_check")]
sanity_checks::check_memory(&gc.heap.limits, &gc.heap.roots);
#[cfg(feature = "memory_check")]
sanity_checks::take_snapshot(&mut gc.heap);

write_barrier::init_write_barrier(gc.heap.mem);
write_barrier::init_generational_write_barrier(gc.heap.mem);
}

#[cfg(feature = "ic")]
Expand Down
1 change: 1 addition & 0 deletions rts/motoko-rts/src/gc/generational/mark_stack.rs
Expand Up @@ -26,6 +26,7 @@ pub unsafe fn alloc_mark_stack<M: Memory>(mem: &mut M) {
assert!(STACK_BLOB_PTR.is_null());

// Allocating an actual object here to not break dump_heap
// No post allocation barrier as this RTS-internal blob will be collected by the GC.
STACK_BLOB_PTR = alloc_blob(mem, INIT_STACK_SIZE.to_bytes()).get_ptr() as *mut Blob;
STACK_BASE = STACK_BLOB_PTR.payload_addr() as *mut usize;
STACK_PTR = STACK_BASE;
Expand Down
2 changes: 2 additions & 0 deletions rts/motoko-rts/src/gc/generational/remembered_set.rs
Expand Up @@ -223,6 +223,7 @@ impl RememberedSetIterator {
}

unsafe fn new_table<M: Memory>(mem: &mut M, size: u32) -> *mut Blob {
// No post allocation barrier as this RTS-internal blob will be collected by the GC.
let table = alloc_blob(mem, Bytes(size * size_of::<HashEntry>() as u32)).as_blob_mut();
for index in 0..size {
table_set(table, index, null_ptr_value());
Expand All @@ -232,6 +233,7 @@ unsafe fn new_table<M: Memory>(mem: &mut M, size: u32) -> *mut Blob {

unsafe fn new_collision_node<M: Memory>(mem: &mut M, value: Value) -> *mut CollisionNode {
debug_assert!(!is_null_ptr_value(value));
// No post allocation barrier as this RTS-internal blob will be collected by the GC.
let node =
alloc_blob(mem, Bytes(size_of::<HashEntry>() as u32)).as_blob_mut() as *mut CollisionNode;
(*node).entry = HashEntry {
Expand Down
1 change: 1 addition & 0 deletions rts/motoko-rts/src/gc/generational/sanity_checks.rs
Expand Up @@ -17,6 +17,7 @@ static mut SNAPSHOT: *mut Blob = null_mut();
/// Take a memory snapshot. To be initiated after GC run.
pub unsafe fn take_snapshot<M: Memory>(heap: &mut Heap<M>) {
let length = Bytes(heap.limits.free as u32);
// No post allocation barrier as this RTS-internal blob will be collected by the GC.
let blob = alloc_blob(heap.mem, length).get_ptr() as *mut Blob;
memcpy_bytes(blob.payload_addr() as usize, 0, length);
SNAPSHOT = blob;
Expand Down
11 changes: 6 additions & 5 deletions rts/motoko-rts/src/gc/generational/write_barrier.rs
Expand Up @@ -9,22 +9,22 @@ pub static mut REMEMBERED_SET: Option<RememberedSet> = None;
pub static mut HEAP_BASE: u32 = 0;
pub static mut LAST_HP: u32 = 0;

#[cfg(feature = "ic")]
/// (Re-)initialize the write barrier for generational GC.
#[ic_mem_fn(ic_only)]
pub unsafe fn init_write_barrier<M: Memory>(mem: &mut M) {
pub(crate) unsafe fn init_generational_write_barrier<M: Memory>(mem: &mut M) {
use crate::memory::ic;
REMEMBERED_SET = Some(RememberedSet::new(mem));
HEAP_BASE = ic::get_aligned_heap_base();
LAST_HP = ic::LAST_HP;
}

/// Write barrier to be called AFTER the pointer store, used for generational GC.
/// Write barrier to be called AFTER the pointer store, used for the generational GC.
/// `location`: location of modified pointer (address of object field or array element).
///
/// As the barrier is called after the write, `*location` refers to the NEW value.
/// No effect is the write barrier is deactivated.
/// No effect if the write barrier is deactivated.
#[ic_mem_fn]
pub unsafe fn write_barrier<M: Memory>(mem: &mut M, location: u32) {
pub unsafe fn post_write_barrier<M: Memory>(mem: &mut M, location: u32) {
// Must be an unskewed address.
debug_assert_eq!(location & 0b1, 0);
// Checks have been optimized according to the frequency of occurrence.
Expand All @@ -33,6 +33,7 @@ pub unsafe fn write_barrier<M: Memory>(mem: &mut M, location: u32) {
// Nested ifs are more efficient when counting instructions on IC (explicit return counts as an instruction).
let value = *(location as *mut Value);
if value.points_to_or_beyond(LAST_HP as usize) {
#[allow(clippy::collapsible_if)]
if location >= HEAP_BASE {
// Trap pointers that lead from old generation (or static roots) to young generation.
REMEMBERED_SET
Expand Down
18 changes: 18 additions & 0 deletions rts/motoko-rts/src/gc/incremental.rs
@@ -0,0 +1,18 @@
use motoko_rts_macros::ic_mem_fn;

#[cfg(feature = "ic")]
use crate::memory::Memory;

pub mod barriers;

#[ic_mem_fn(ic_only)]
unsafe fn initialize_incremental_gc<M: Memory>(_mem: &mut M) {
use crate::memory::ic;
ic::initialize_memory();
}

#[ic_mem_fn(ic_only)]
unsafe fn schedule_incremental_gc<M: Memory>(_mem: &mut M) {}

#[ic_mem_fn(ic_only)]
unsafe fn incremental_gc<M: Memory>(_mem: &mut M) {}