@@ -967,6 +967,8 @@ struct heap_page {
967
967
bits_t uncollectible_bits [HEAP_PAGE_BITMAP_LIMIT ];
968
968
bits_t marking_bits [HEAP_PAGE_BITMAP_LIMIT ];
969
969
970
+ bits_t remembered_bits [HEAP_PAGE_BITMAP_LIMIT ];
971
+
970
972
/* If set, the object is not movable */
971
973
bits_t pinned_bits [HEAP_PAGE_BITMAP_LIMIT ];
972
974
};
@@ -1548,7 +1550,8 @@ check_rvalue_consistency_force(const VALUE obj, int terminate)
1548
1550
const int wb_unprotected_bit = RVALUE_WB_UNPROTECTED_BITMAP (obj ) != 0 ;
1549
1551
const int uncollectible_bit = RVALUE_UNCOLLECTIBLE_BITMAP (obj ) != 0 ;
1550
1552
const int mark_bit = RVALUE_MARK_BITMAP (obj ) != 0 ;
1551
- const int marking_bit = RVALUE_MARKING_BITMAP (obj ) != 0 , remembered_bit = marking_bit ;
1553
+ const int marking_bit = RVALUE_MARKING_BITMAP (obj ) != 0 ;
1554
+ const int remembered_bit = MARKED_IN_BITMAP (GET_HEAP_PAGE (obj )-> remembered_bits , obj ) != 0 ;
1552
1555
const int age = RVALUE_FLAGS_AGE (RBASIC (obj )-> flags );
1553
1556
1554
1557
if (GET_HEAP_PAGE (obj )-> flags .in_tomb ) {
@@ -1682,7 +1685,7 @@ static inline int
1682
1685
RVALUE_REMEMBERED (VALUE obj )
1683
1686
{
1684
1687
check_rvalue_consistency (obj );
1685
- return RVALUE_MARKING_BITMAP ( obj ) != 0 ;
1688
+ return MARKED_IN_BITMAP ( GET_HEAP_PAGE ( obj ) -> remembered_bits , obj ) != 0 ;
1686
1689
}
1687
1690
1688
1691
static inline int
@@ -1763,31 +1766,6 @@ RVALUE_AGE_INC(rb_objspace_t *objspace, VALUE obj)
1763
1766
check_rvalue_consistency (obj );
1764
1767
}
1765
1768
1766
- /* set age to RVALUE_OLD_AGE */
1767
- static inline void
1768
- RVALUE_AGE_SET_OLD (rb_objspace_t * objspace , VALUE obj )
1769
- {
1770
- check_rvalue_consistency (obj );
1771
- GC_ASSERT (!RVALUE_OLD_P (obj ));
1772
-
1773
- RBASIC (obj )-> flags = RVALUE_FLAGS_AGE_SET (RBASIC (obj )-> flags , RVALUE_OLD_AGE );
1774
- RVALUE_OLD_UNCOLLECTIBLE_SET (objspace , obj );
1775
-
1776
- check_rvalue_consistency (obj );
1777
- }
1778
-
1779
- /* set age to RVALUE_OLD_AGE - 1 */
1780
- static inline void
1781
- RVALUE_AGE_SET_CANDIDATE (rb_objspace_t * objspace , VALUE obj )
1782
- {
1783
- check_rvalue_consistency (obj );
1784
- GC_ASSERT (!RVALUE_OLD_P (obj ));
1785
-
1786
- RBASIC (obj )-> flags = RVALUE_FLAGS_AGE_SET (RBASIC (obj )-> flags , RVALUE_OLD_AGE - 1 );
1787
-
1788
- check_rvalue_consistency (obj );
1789
- }
1790
-
1791
1769
static inline void
1792
1770
RVALUE_DEMOTE_RAW (rb_objspace_t * objspace , VALUE obj )
1793
1771
{
@@ -1802,7 +1780,7 @@ RVALUE_DEMOTE(rb_objspace_t *objspace, VALUE obj)
1802
1780
GC_ASSERT (RVALUE_OLD_P (obj ));
1803
1781
1804
1782
if (!is_incremental_marking (objspace ) && RVALUE_REMEMBERED (obj )) {
1805
- CLEAR_IN_BITMAP (GET_HEAP_MARKING_BITS (obj ), obj );
1783
+ CLEAR_IN_BITMAP (GET_HEAP_PAGE (obj )-> remembered_bits , obj );
1806
1784
}
1807
1785
1808
1786
RVALUE_DEMOTE_RAW (objspace , obj );
@@ -6976,31 +6954,8 @@ rgengc_check_relation(rb_objspace_t *objspace, VALUE obj)
6976
6954
const VALUE old_parent = objspace -> rgengc .parent_object ;
6977
6955
6978
6956
if (old_parent ) { /* parent object is old */
6979
- if (RVALUE_WB_UNPROTECTED (obj )) {
6980
- if (gc_remember_unprotected (objspace , obj )) {
6981
- gc_report (2 , objspace , "relation: (O->S) %s -> %s\n" , obj_info (old_parent ), obj_info (obj ));
6982
- }
6983
- }
6984
- else {
6985
- if (!RVALUE_OLD_P (obj )) {
6986
- if (RVALUE_MARKED (obj )) {
6987
- /* An object pointed from an OLD object should be OLD. */
6988
- gc_report (2 , objspace , "relation: (O->unmarked Y) %s -> %s\n" , obj_info (old_parent ), obj_info (obj ));
6989
- RVALUE_AGE_SET_OLD (objspace , obj );
6990
- if (is_incremental_marking (objspace )) {
6991
- if (!RVALUE_MARKING (obj )) {
6992
- gc_grey (objspace , obj );
6993
- }
6994
- }
6995
- else {
6996
- rgengc_remember (objspace , obj );
6997
- }
6998
- }
6999
- else {
7000
- gc_report (2 , objspace , "relation: (O->Y) %s -> %s\n" , obj_info (old_parent ), obj_info (obj ));
7001
- RVALUE_AGE_SET_CANDIDATE (objspace , obj );
7002
- }
7003
- }
6957
+ if (RVALUE_WB_UNPROTECTED (obj ) || !RVALUE_OLD_P (obj )) {
6958
+ rgengc_remember (objspace , old_parent );
7004
6959
}
7005
6960
}
7006
6961
@@ -8791,9 +8746,7 @@ static int
8791
8746
rgengc_remembersetbits_set (rb_objspace_t * objspace , VALUE obj )
8792
8747
{
8793
8748
struct heap_page * page = GET_HEAP_PAGE (obj );
8794
- bits_t * bits = & page -> marking_bits [0 ];
8795
-
8796
- GC_ASSERT (!is_incremental_marking (objspace ));
8749
+ bits_t * bits = & page -> remembered_bits [0 ];
8797
8750
8798
8751
if (MARKED_IN_BITMAP (bits , obj )) {
8799
8752
return FALSE;
@@ -8886,7 +8839,7 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap)
8886
8839
if (page -> flags .has_remembered_objects | page -> flags .has_uncollectible_shady_objects ) {
8887
8840
uintptr_t p = page -> start ;
8888
8841
bits_t bitset , bits [HEAP_PAGE_BITMAP_LIMIT ];
8889
- bits_t * marking_bits = page -> marking_bits ;
8842
+ bits_t * remembered_bits = page -> remembered_bits ;
8890
8843
bits_t * uncollectible_bits = page -> uncollectible_bits ;
8891
8844
bits_t * wb_unprotected_bits = page -> wb_unprotected_bits ;
8892
8845
#if PROFILE_REMEMBERSET_MARK
@@ -8895,8 +8848,8 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap)
8895
8848
else if (page -> flags .has_uncollectible_shady_objects ) has_shady ++ ;
8896
8849
#endif
8897
8850
for (j = 0 ; j < HEAP_PAGE_BITMAP_LIMIT ; j ++ ) {
8898
- bits [j ] = marking_bits [j ] | (uncollectible_bits [j ] & wb_unprotected_bits [j ]);
8899
- marking_bits [j ] = 0 ;
8851
+ bits [j ] = remembered_bits [j ] | (uncollectible_bits [j ] & wb_unprotected_bits [j ]);
8852
+ remembered_bits [j ] = 0 ;
8900
8853
}
8901
8854
page -> flags .has_remembered_objects = FALSE;
8902
8855
@@ -8933,6 +8886,7 @@ rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap)
8933
8886
memset (& page -> mark_bits [0 ], 0 , HEAP_PAGE_BITMAP_SIZE );
8934
8887
memset (& page -> uncollectible_bits [0 ], 0 , HEAP_PAGE_BITMAP_SIZE );
8935
8888
memset (& page -> marking_bits [0 ], 0 , HEAP_PAGE_BITMAP_SIZE );
8889
+ memset (& page -> remembered_bits [0 ], 0 , HEAP_PAGE_BITMAP_SIZE );
8936
8890
memset (& page -> pinned_bits [0 ], 0 , HEAP_PAGE_BITMAP_SIZE );
8937
8891
page -> flags .has_uncollectible_shady_objects = FALSE;
8938
8892
page -> flags .has_remembered_objects = FALSE;
@@ -9006,18 +8960,7 @@ gc_writebarrier_incremental(VALUE a, VALUE b, rb_objspace_t *objspace)
9006
8960
}
9007
8961
}
9008
8962
else if (RVALUE_OLD_P (a ) && !RVALUE_OLD_P (b )) {
9009
- if (!RVALUE_WB_UNPROTECTED (b )) {
9010
- gc_report (1 , objspace , "gc_writebarrier_incremental: [GN] %p -> %s\n" , (void * )a , obj_info (b ));
9011
- RVALUE_AGE_SET_OLD (objspace , b );
9012
-
9013
- if (RVALUE_BLACK_P (b )) {
9014
- gc_grey (objspace , b );
9015
- }
9016
- }
9017
- else {
9018
- gc_report (1 , objspace , "gc_writebarrier_incremental: [LL] %p -> %s\n" , (void * )a , obj_info (b ));
9019
- gc_remember_unprotected (objspace , b );
9020
- }
8963
+ rgengc_remember (objspace , a );
9021
8964
}
9022
8965
9023
8966
if (UNLIKELY (objspace -> flags .during_compacting )) {
@@ -9947,7 +9890,6 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t src_slot_size, s
9947
9890
int marked ;
9948
9891
int wb_unprotected ;
9949
9892
int uncollectible ;
9950
- int marking ;
9951
9893
RVALUE * dest = (RVALUE * )free ;
9952
9894
RVALUE * src = (RVALUE * )scan ;
9953
9895
@@ -9956,17 +9898,19 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t src_slot_size, s
9956
9898
GC_ASSERT (BUILTIN_TYPE (scan ) != T_NONE );
9957
9899
GC_ASSERT (!MARKED_IN_BITMAP (GET_HEAP_MARK_BITS (free ), free ));
9958
9900
9901
+ GC_ASSERT (!RVALUE_MARKING ((VALUE )src ));
9902
+
9959
9903
/* Save off bits for current object. */
9960
9904
marked = rb_objspace_marked_object_p ((VALUE )src );
9961
9905
wb_unprotected = RVALUE_WB_UNPROTECTED ((VALUE )src );
9962
9906
uncollectible = RVALUE_UNCOLLECTIBLE ((VALUE )src );
9963
- marking = RVALUE_MARKING ((VALUE )src );
9907
+ bool remembered = RVALUE_REMEMBERED ((VALUE )src );
9964
9908
9965
9909
/* Clear bits for eventual T_MOVED */
9966
9910
CLEAR_IN_BITMAP (GET_HEAP_MARK_BITS ((VALUE )src ), (VALUE )src );
9967
9911
CLEAR_IN_BITMAP (GET_HEAP_WB_UNPROTECTED_BITS ((VALUE )src ), (VALUE )src );
9968
9912
CLEAR_IN_BITMAP (GET_HEAP_UNCOLLECTIBLE_BITS ((VALUE )src ), (VALUE )src );
9969
- CLEAR_IN_BITMAP (GET_HEAP_MARKING_BITS ((VALUE )src ), (VALUE )src );
9913
+ CLEAR_IN_BITMAP (GET_HEAP_PAGE ((VALUE )src )-> remembered_bits , (VALUE )src );
9970
9914
9971
9915
if (FL_TEST ((VALUE )src , FL_EXIVAR )) {
9972
9916
/* Resizing the st table could cause a malloc */
@@ -10005,11 +9949,11 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t src_slot_size, s
10005
9949
memset (src , 0 , src_slot_size );
10006
9950
10007
9951
/* Set bits for object in new location */
10008
- if (marking ) {
10009
- MARK_IN_BITMAP (GET_HEAP_MARKING_BITS (( VALUE ) dest ), (VALUE )dest );
9952
+ if (remembered ) {
9953
+ MARK_IN_BITMAP (GET_HEAP_PAGE ( dest )-> remembered_bits , (VALUE )dest );
10010
9954
}
10011
9955
else {
10012
- CLEAR_IN_BITMAP (GET_HEAP_MARKING_BITS (( VALUE ) dest ), (VALUE )dest );
9956
+ CLEAR_IN_BITMAP (GET_HEAP_PAGE ( dest )-> remembered_bits , (VALUE )dest );
10013
9957
}
10014
9958
10015
9959
if (marked ) {
@@ -10781,7 +10725,7 @@ gc_ref_update(void *vstart, void *vend, size_t stride, rb_objspace_t * objspace,
10781
10725
if (RVALUE_WB_UNPROTECTED (v )) {
10782
10726
page -> flags .has_uncollectible_shady_objects = TRUE;
10783
10727
}
10784
- if (RVALUE_PAGE_MARKING ( page , v )) {
10728
+ if (RVALUE_REMEMBERED ( v )) {
10785
10729
page -> flags .has_remembered_objects = TRUE;
10786
10730
}
10787
10731
if (page -> flags .before_sweep ) {
0 commit comments