@@ -4,7 +4,7 @@ use crate::{upcalls, Ruby, RubyEdge};
4
4
use mmtk:: scheduler:: GCWorker ;
5
5
use mmtk:: util:: { ObjectReference , VMWorkerThread } ;
6
6
use mmtk:: vm:: { EdgeVisitor , ObjectTracer , RootsWorkFactory , Scanning } ;
7
- use mmtk:: { Mutator , MutatorContext } ;
7
+ use mmtk:: { memory_manager , Mutator , MutatorContext } ;
8
8
9
9
pub struct VMScanning { }
10
10
@@ -33,8 +33,13 @@ impl Scanning<Ruby> for VMScanning {
33
33
"Not an MMTk object: {object}" ,
34
34
) ;
35
35
let gc_tls = unsafe { GCThreadTLS :: from_vwt_check ( tls) } ;
36
- let visit_object = |_worker, target_object : ObjectReference , _pin| {
37
- trace ! ( "Tracing object: {} -> {}" , object, target_object) ;
36
+ let visit_object = |_worker, target_object : ObjectReference , pin| {
37
+ trace ! (
38
+ "Tracing object: {} -> {}{}" ,
39
+ object,
40
+ target_object,
41
+ if pin { " pin" } else { "" }
42
+ ) ;
38
43
debug_assert ! (
39
44
mmtk:: memory_manager:: is_mmtk_object( target_object. to_raw_address( ) ) ,
40
45
"Destination is not an MMTk object. Src: {object} dst: {target_object}"
@@ -90,6 +95,7 @@ impl Scanning<Ruby> for VMScanning {
90
95
. weak_proc
91
96
. process_weak_stuff ( worker, tracer_context) ;
92
97
crate :: binding ( ) . ppp_registry . cleanup_ppps ( ) ;
98
+ crate :: binding ( ) . unpin_pinned_roots ( ) ;
93
99
false
94
100
}
95
101
@@ -111,8 +117,21 @@ impl VMScanning {
111
117
callback : F ,
112
118
) {
113
119
let mut buffer: Vec < ObjectReference > = Vec :: new ( ) ;
114
- let visit_object = |_, object : ObjectReference , _pin| {
115
- debug ! ( "[{}] Scanning object: {}" , root_scan_kind, object) ;
120
+ let mut my_pinned_roots = vec ! [ ] ;
121
+ let visit_object = |_, object : ObjectReference , pin| {
122
+ debug ! (
123
+ "[{}] Visiting object: {}{}" ,
124
+ root_scan_kind,
125
+ object,
126
+ if pin {
127
+ "(unmovable root)"
128
+ } else {
129
+ "(movable, but we pin it anyway)"
130
+ }
131
+ ) ;
132
+ if memory_manager:: pin_object :: < Ruby > ( object) {
133
+ my_pinned_roots. push ( object) ;
134
+ }
116
135
buffer. push ( object) ;
117
136
if buffer. len ( ) >= Self :: OBJECT_BUFFER_SIZE {
118
137
factory. create_process_node_roots_work ( std:: mem:: take ( & mut buffer) ) ;
@@ -122,8 +141,20 @@ impl VMScanning {
122
141
gc_tls
123
142
. object_closure
124
143
. set_temporarily_and_run_code ( visit_object, callback) ;
144
+
125
145
if !buffer. is_empty ( ) {
126
146
factory. create_process_node_roots_work ( buffer) ;
127
147
}
148
+
149
+ info ! (
150
+ "Pinned {} node roots during {}" ,
151
+ my_pinned_roots. len( ) ,
152
+ root_scan_kind
153
+ ) ;
154
+
155
+ {
156
+ let mut pinned_roots = crate :: binding ( ) . pinned_roots . lock ( ) . unwrap ( ) ;
157
+ pinned_roots. append ( & mut my_pinned_roots) ;
158
+ }
128
159
}
129
160
}
0 commit comments