@@ -43,7 +43,6 @@ struct CollectorStatus {
4343collect_threshold :  usize , 
4444    /// in bytes 
4545bytes_allocated_since_last_gc :  usize , 
46-     last_gc_time :  std:: time:: SystemTime , 
4746    collecting :  bool , 
4847} 
4948
@@ -104,7 +103,6 @@ impl Collector {
104103                status :  RefCell :: new ( CollectorStatus  { 
105104                    collect_threshold :  1024 , 
106105                    bytes_allocated_since_last_gc :  0 , 
107-                     last_gc_time :  std:: time:: SystemTime :: now ( ) , 
108106                    collecting :  false , 
109107                } ) , 
110108            } 
@@ -222,13 +220,13 @@ impl Collector {
222220/// 现在纠正为 
223221/// 
224222/// ptr -> new_ptr(forwarded) -> value 
225- unsafe  fn  correct_ptr ( & self ,  ptr :  * mut  u8 )  { 
223+ unsafe  fn  correct_ptr ( & self ,  ptr :  * mut  u8 ,   offset :   isize )  { 
226224        let  ptr = ptr as  * mut  AtomicPtr < * mut  u8 > ; 
227225        let  new_ptr = * ( * ptr) . load ( Ordering :: SeqCst ) ; 
228226        let  ptr = ptr as  * mut  * mut  u8 ; 
229227        debug_assert ! ( !new_ptr. is_null( ) ) ; 
230228        log:: trace!( "gc {} correct ptr {:p} to {:p}" ,  self . id,  ptr,  new_ptr) ; 
231-         * ptr = new_ptr; 
229+         * ptr = new_ptr. offset ( offset ) ; 
232230    } 
233231
234232    #[ cfg( feature = "llvm_gc_plugin" ) ]  
@@ -248,37 +246,39 @@ impl Collector {
248246            return ; 
249247        } 
250248
251-         let  mut   ptr = * ( ptr as  * mut  * mut  u8 ) ; 
249+         let  ptr = * ( ptr as  * mut  * mut  u8 ) ; 
252250        // println!("mark ptr {:p} -> {:p}", father, ptr); 
253251        // mark it if it is in heap 
254252        if  self . thread_local_allocator . as_mut ( ) . unwrap ( ) . in_heap ( ptr)  { 
255253            // println!("mark ptr succ {:p} -> {:p}", father, ptr); 
256254            let  block = Block :: from_obj_ptr ( ptr) ; 
257255            let  is_candidate = block. is_eva_candidate ( ) ; 
256+             let  mut  head = block. get_head_ptr ( ptr) ; 
257+             let  offset_from_head = ptr. offset_from ( head) ; 
258258            if  !is_candidate { 
259259                block. marked  = true ; 
260260            }  else  { 
261-                 let  ( line_header,  _)  = block. get_line_header_from_addr ( ptr ) ; 
261+                 let  ( line_header,  _)  = block. get_line_header_from_addr ( head ) ; 
262262                if  line_header. get_forwarded ( )  { 
263-                     self . correct_ptr ( father) ; 
263+                     self . correct_ptr ( father,  offset_from_head ) ; 
264264                    return ; 
265265                } 
266266            } 
267-             let  ( line_header,  idx)  = block. get_line_header_from_addr ( ptr ) ; 
267+             let  ( line_header,  idx)  = block. get_line_header_from_addr ( head ) ; 
268268            if  line_header. get_marked ( )  { 
269269                return ; 
270270            } 
271271            // 若此block是待驱逐对象 
272272            if  is_candidate { 
273-                 let  atomic_ptr = ptr  as  * mut  AtomicPtr < u8 > ; 
273+                 let  atomic_ptr = head  as  * mut  AtomicPtr < u8 > ; 
274274                let  old_loaded = ( * atomic_ptr) . load ( Ordering :: SeqCst ) ; 
275-                 let  obj_line_size = line_header. get_obj_line_size ( idx,  Block :: from_obj_ptr ( ptr ) ) ; 
275+                 let  obj_line_size = line_header. get_obj_line_size ( idx,  Block :: from_obj_ptr ( head ) ) ; 
276276                let  new_ptr = self . alloc ( obj_line_size *  LINE_SIZE ,  line_header. get_obj_type ( ) ) ; 
277277                if  !new_ptr. is_null ( )  { 
278278                    let  new_block = Block :: from_obj_ptr ( new_ptr) ; 
279279                    let  ( new_line_header,  _)  = new_block. get_line_header_from_addr ( new_ptr) ; 
280280                    // 将数据复制到新的地址 
281-                     core:: ptr:: copy_nonoverlapping ( ptr ,  new_ptr,  obj_line_size *  LINE_SIZE ) ; 
281+                     core:: ptr:: copy_nonoverlapping ( head ,  new_ptr,  obj_line_size *  LINE_SIZE ) ; 
282282                    // core::ptr::copy_nonoverlapping(line_header as * const u8, new_line_header as * mut u8, line_size); 
283283
284284                    // 线程安全性说明 
@@ -293,16 +293,16 @@ impl Collector {
293293                        . is_ok ( ) 
294294                    { 
295295                        // 成功驱逐 
296-                         log:: trace!( "gc {}: eva {:p} to {:p}" ,  self . id,  ptr ,  new_ptr) ; 
296+                         log:: trace!( "gc {}: eva {:p} to {:p}" ,  self . id,  head ,  new_ptr) ; 
297297                        new_line_header. set_marked ( true ) ; 
298298                        line_header. set_forwarded ( true ) ; 
299299                        new_block. marked  = true ; 
300-                         ptr  = new_ptr; 
301-                         self . correct_ptr ( father) ; 
300+                         head  = new_ptr; 
301+                         self . correct_ptr ( father,  offset_from_head ) ; 
302302                    }  else  { 
303303                        // 期间别的线程驱逐了它 
304304                        spin_until ! ( line_header. get_forwarded( ) ) ; 
305-                         self . correct_ptr ( father) ; 
305+                         self . correct_ptr ( father,  offset_from_head ) ; 
306306                        return ; 
307307                    } 
308308                } 
@@ -311,7 +311,7 @@ impl Collector {
311311            let  obj_type = line_header. get_obj_type ( ) ; 
312312            match  obj_type { 
313313                ObjectType :: Atomic  => { } 
314-                 _ => ( * self . queue ) . push ( ( ptr ,  obj_type) ) , 
314+                 _ => ( * self . queue ) . push ( ( head ,  obj_type) ) , 
315315            } 
316316            return ; 
317317        } 
@@ -550,7 +550,6 @@ impl Collector {
550550        } 
551551        status. collecting  = true ; 
552552        status. bytes_allocated_since_last_gc  = 0 ; 
553-         status. last_gc_time  = std:: time:: SystemTime :: now ( ) ; 
554553        drop ( status) ; 
555554        // evacuation pre process 
556555        // 这个过程要在完成safepoint同步之前完成,因为在驱逐的情况下 
0 commit comments