Rework the cardtable code to isolate it into a proper module. One less include hack.
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 28 Dec 2011 22:35:17 +0000 (20:35 -0200)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 28 Dec 2011 22:35:17 +0000 (20:35 -0200)
mono/metadata/Makefile.am
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-cardtable.h
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h

index ebc328beff414b200c8511e11eae4eb2f93b3641..e5571940088e9837860ef19a86d483a09eb09bb7 100644 (file)
@@ -81,7 +81,6 @@ null_sources = \
        console-null.c
 
 sgen_sources = \
-       sgen-cardtable.c        \
        sgen-gray.c             \
        sgen-pinning.c          \
        sgen-pinning-stats.c    \
@@ -207,6 +206,7 @@ libmonoruntime_la_SOURCES = \
        sgen-gc.h               \
        sgen-conf.h             \
        sgen-archdep.h          \
+       sgen-cardtable.c        \
        sgen-cardtable.h        \
        sgen-major-copy-object.h \
        sgen-major-scan-object.h \
index 8ebaf77b6dc91793004f6a6ce7115c278b5071be..2d9e1592a4b36cc8d2a1ec5553b357360575678d 100644 (file)
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include "config.h"
+#ifdef HAVE_SGEN_GC
+
+#include "metadata/sgen-gc.h"
+#include "metadata/sgen-cardtable.h"
+#include "utils/mono-counters.h"
+#include "utils/mono-time.h"
+
 #ifdef SGEN_HAVE_CARDTABLE
 
 //#define CARDTABLE_STATS
@@ -134,18 +142,6 @@ sgen_card_table_get_card_data (guint8 *data_dest, mword address, mword cards)
        return mask;
 }
 
-static gboolean
-sgen_card_table_address_is_marked (mword address)
-{
-       return *sgen_card_table_get_card_address (address) != 0;
-}
-
-void
-sgen_card_table_mark_address (mword address)
-{
-       *sgen_card_table_get_card_address (address) = 1;
-}
-
 void*
 sgen_card_table_align_pointer (void *ptr)
 {
@@ -172,8 +168,8 @@ sgen_card_table_is_range_marked (guint8 *cards, mword address, mword size)
 
 }
 
-static void
-card_table_init (void)
+void
+sgen_card_table_init (void)
 {
        sgen_cardtable = mono_sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, TRUE);
 
@@ -245,50 +241,46 @@ clear_cards (mword start, mword size)
 
 #endif
 
-static void
-card_table_clear (void)
+void
+sgen_card_table_clear (void)
 {
        /*XXX we could do this in 2 ways. using mincore or iterating over all sections/los objects */
-       if (use_cardtable) {
-               major_collector.iterate_live_block_ranges (clear_cards);
-               mono_sgen_los_iterate_live_block_ranges (clear_cards);
-       }
+       sgen_major_collector_iterate_live_block_ranges (clear_cards);
+       mono_sgen_los_iterate_live_block_ranges (clear_cards);
 }
-static void
-scan_from_card_tables (void *start_nursery, void *end_nursery, GrayQueue *queue)
+
+void
+sgen_scan_from_card_tables (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
 {
-       if (use_cardtable) {
-               TV_DECLARE (atv);
-               TV_DECLARE (btv);
+       SGEN_TV_DECLARE (atv);
+       SGEN_TV_DECLARE (btv);
 
 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
        /*FIXME we should have a bit on each block/los object telling if the object have marked cards.*/
        /*First we copy*/
-       major_collector.iterate_live_block_ranges (move_cards_to_shadow_table);
+       sgen_major_collector_iterate_live_block_ranges (move_cards_to_shadow_table);
        mono_sgen_los_iterate_live_block_ranges (move_cards_to_shadow_table);
 
        /*Then we clear*/
-       card_table_clear ();
+       sgen_card_table_clear ();
 #endif
-               TV_GETTIME (atv);
-               major_collector.scan_card_table (queue);
-               TV_GETTIME (btv);
-               last_major_scan_time = TV_ELAPSED_MS (atv, btv); 
-               major_card_scan_time += last_major_scan_time;
-               mono_sgen_los_scan_card_table (queue);
-               TV_GETTIME (atv);
-               last_los_scan_time = TV_ELAPSED_MS (btv, atv);
-               los_card_scan_time += last_los_scan_time;
-       }
+       SGEN_TV_GETTIME (atv);
+       sgen_major_collector_scan_card_table (queue);
+       SGEN_TV_GETTIME (btv);
+       last_major_scan_time = SGEN_TV_ELAPSED_MS (atv, btv); 
+       major_card_scan_time += last_major_scan_time;
+       mono_sgen_los_scan_card_table (queue);
+       SGEN_TV_GETTIME (atv);
+       last_los_scan_time = SGEN_TV_ELAPSED_MS (btv, atv);
+       los_card_scan_time += last_los_scan_time;
 }
 
 guint8*
 mono_gc_get_card_table (int *shift_bits, gpointer *mask)
 {
-       if (!use_cardtable)
+       if (!sgen_cardtable)
                return NULL;
 
-       g_assert (sgen_cardtable);
        *shift_bits = CARD_BITS;
 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
        *mask = (gpointer)CARD_MASK;
@@ -395,7 +387,7 @@ find_next_card (guint8 *card_data, guint8 *end)
 void
 sgen_cardtable_scan_object (char *obj, mword block_obj_size, guint8 *cards, SgenGrayQueue *queue)
 {
-       MonoVTable *vt = (MonoVTable*)LOAD_VTABLE (obj);
+       MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
        MonoClass *klass = vt->klass;
        CopyOrMarkObjectFunc copy_func = mono_sgen_get_copy_object ();
        ScanObjectFunc scan_object_func = mono_sgen_get_minor_scan_object ();
@@ -471,11 +463,11 @@ LOOP_HEAD:
                                HEAVY_STAT (++los_array_cards);
                                for (; elem < card_end; elem += SIZEOF_VOID_P) {
                                        gpointer new, old = *(gpointer*)elem;
-                                       if (G_UNLIKELY (ptr_in_nursery (old))) {
+                                       if (G_UNLIKELY (sgen_ptr_in_nursery (old))) {
                                                HEAVY_STAT (++los_array_remsets);
                                                copy_func ((void**)elem, queue);
                                                new = *(gpointer*)elem;
-                                               if (G_UNLIKELY (ptr_in_nursery (new)))
+                                               if (G_UNLIKELY (sgen_ptr_in_nursery (new)))
                                                        mono_sgen_add_to_global_remset (elem);
                                        }
                                }
@@ -537,20 +529,20 @@ count_remarked_cards (mword start, mword size)
 
 #endif
 
-static void
-card_tables_collect_stats (gboolean begin)
+void
+sgen_card_tables_collect_stats (gboolean begin)
 {
 #ifdef CARDTABLE_STATS
        if (begin) {
                memset (&major_stats, 0, sizeof (card_stats));
                memset (&los_stats, 0, sizeof (card_stats));
                cur_stats = &major_stats;
-               major_collector.iterate_live_block_ranges (count_marked_cards);
+               sgen_major_collector_iterate_live_block_ranges (count_marked_cards);
                cur_stats = &los_stats;
                mono_sgen_los_iterate_live_block_ranges (count_marked_cards);
        } else {
                cur_stats = &major_stats;
-               major_collector.iterate_live_block_ranges (count_marked_cards);
+               sgen_major_collector_iterate_live_block_ranges (count_marked_cards);
                cur_stats = &los_stats;
                mono_sgen_los_iterate_live_block_ranges (count_remarked_cards);
                printf ("cards major (t %d m %d r %d)  los (t %d m %d r %d) major_scan %lld los_scan %lld\n", 
@@ -575,12 +567,6 @@ sgen_card_table_mark_range (mword address, mword size)
        g_assert_not_reached ();
 }
 
-#define sgen_card_table_address_is_marked(p)   FALSE
-#define scan_from_card_tables(start,end,queue)
-#define card_table_clear()
-#define card_table_init()
-#define card_tables_collect_stats(begin)
-
 guint8*
 mono_gc_get_card_table (int *shift_bits, gpointer *mask)
 {
@@ -588,3 +574,5 @@ mono_gc_get_card_table (int *shift_bits, gpointer *mask)
 }
 
 #endif
+
+#endif /*HAVE_SGEN_GC*/
\ No newline at end of file
index c1a87471835d8f1101d08e9d8f30f4fb22553492..af12d33be88047dcda3958c6819ac6c7dcdd824b 100644 (file)
 
 void sgen_card_table_reset_region (mword start, mword end) MONO_INTERNAL;
 void* sgen_card_table_align_pointer (void *ptr) MONO_INTERNAL;
-void sgen_card_table_mark_address (mword address) MONO_INTERNAL;
 void sgen_card_table_mark_range (mword address, mword size) MONO_INTERNAL;
 void sgen_cardtable_scan_object (char *obj, mword obj_size, guint8 *cards, SgenGrayQueue *queue) MONO_INTERNAL;
+
 gboolean sgen_card_table_get_card_data (guint8 *dest, mword address, mword cards) MONO_INTERNAL;
+void sgen_scan_from_card_tables (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
+void sgen_card_tables_collect_stats (gboolean begin) MONO_INTERNAL;
+void sgen_card_table_clear (void) MONO_INTERNAL;
+void sgen_card_table_init (void) MONO_INTERNAL;
+gboolean sgen_ptr_in_nursery (void *p) MONO_INTERNAL;
+
 
 /*How many bytes a single card covers*/
 #define CARD_BITS 9
@@ -111,6 +117,47 @@ sgen_card_table_prepare_card_for_scanning (guint8 *card)
 
 #endif
 
+static inline gboolean
+sgen_card_table_address_is_marked (mword address)
+{
+       return *sgen_card_table_get_card_address (address) != 0;
+}
+
+static inline void
+sgen_card_table_mark_address (mword address)
+{
+       *sgen_card_table_get_card_address (address) = 1;
+}
+
+
+#elif
+
+#else
+
+void
+sgen_card_table_mark_address (mword address)
+{
+       g_assert_not_reached ();
+}
+
+void
+sgen_card_table_mark_range (mword address, mword size)
+{
+       g_assert_not_reached ();
+}
+
+#define sgen_card_table_address_is_marked(p)   FALSE
+#define sgen_scan_from_card_tables(start,end,queue)
+#define sgen_card_table_clear()
+#define sgen_card_table_init()
+#define sgen_card_tables_collect_stats(begin)
+
+guint8*
+mono_gc_get_card_table (int *shift_bits, gpointer *mask)
+{
+       return NULL;
+}
+
 #endif
 
 
index f756e6e37b80b734e40b05aa795fb2225225902d..1731f975cf559234d1ea207bcad76605a5891144 100644 (file)
 #include "metadata/mempool-internals.h"
 #include "metadata/marshal.h"
 #include "metadata/runtime.h"
+#include "metadata/sgen-cardtable.h"
 #include "utils/mono-mmap.h"
 #include "utils/mono-time.h"
 #include "utils/mono-semaphore.h"
@@ -839,7 +840,6 @@ SgenMajorCollector major_collector;
 #include "sgen-pinning-stats.c"
 #include "sgen-gray.c"
 #include "sgen-workers.c"
-#include "sgen-cardtable.c"
 
 static gboolean
 is_xdomain_ref_allowed (gpointer *ptr, char *obj, MonoDomain *domain)
@@ -2984,8 +2984,8 @@ collect_nursery (size_t requested_size)
 
        if (use_cardtable) {
                atv = btv;
-               card_tables_collect_stats (TRUE);
-               scan_from_card_tables (nursery_start, nursery_next, WORKERS_DISTRIBUTE_GRAY_QUEUE);
+               sgen_card_tables_collect_stats (TRUE);
+               sgen_scan_from_card_tables (nursery_start, nursery_next, WORKERS_DISTRIBUTE_GRAY_QUEUE);
                TV_GETTIME (btv);
                time_minor_scan_card_table += TV_ELAPSED_MS (atv, btv);
        }
@@ -3096,7 +3096,7 @@ collect_nursery (size_t requested_size)
        g_assert (gray_object_queue_is_empty (&gray_queue));
 
        if (use_cardtable)
-               card_tables_collect_stats (FALSE);
+               sgen_card_tables_collect_stats (FALSE);
 
        check_scan_starts ();
 
@@ -3198,7 +3198,7 @@ major_do_collection (const char *reason)
        clear_remsets ();
        global_remset_cache_clear ();
        if (use_cardtable)
-               card_table_clear ();
+               sgen_card_table_clear ();
 
        process_fin_stage_entries ();
        process_dislink_stage_entries ();
@@ -6760,7 +6760,7 @@ mono_gc_base_init (void)
        global_remset->next = NULL;
 
        if (use_cardtable)
-               card_table_init ();
+               sgen_card_table_init ();
 
        gc_initialized = 1;
 }
@@ -7526,4 +7526,22 @@ mono_sgen_gc_unlock (void)
        UNLOCK_GC;
 }
 
+void
+sgen_major_collector_iterate_live_block_ranges (sgen_cardtable_block_callback callback)
+{
+       major_collector.iterate_live_block_ranges (callback);
+}
+
+void
+sgen_major_collector_scan_card_table (SgenGrayQueue *queue)
+{
+       major_collector.scan_card_table (queue);
+}
+
+gboolean
+sgen_ptr_in_nursery (void *p)
+{
+       return SGEN_PTR_IN_NURSERY ((p), DEFAULT_NURSERY_BITS, nursery_start, nursery_end);
+}
+
 #endif /* HAVE_SGEN_GC */
index 11983be6db17f5b4e14800b96584a9a5c078d904..902169b2464f78139885b03d1896c990ddf5b567 100644 (file)
@@ -438,6 +438,7 @@ ScanObjectFunc mono_sgen_get_minor_scan_object (void) MONO_INTERNAL;
 ScanVTypeFunc mono_sgen_get_minor_scan_vtype (void) MONO_INTERNAL;
 
 typedef void (*sgen_cardtable_block_callback) (mword start, mword size);
+void sgen_major_collector_iterate_live_block_ranges (sgen_cardtable_block_callback callback) MONO_INTERNAL;
 
 typedef struct _SgenMajorCollector SgenMajorCollector;
 struct _SgenMajorCollector {
@@ -624,6 +625,7 @@ gboolean mono_sgen_ptr_is_in_los (char *ptr, char **start) MONO_INTERNAL;
 void mono_sgen_los_iterate_objects (IterateObjectCallbackFunc cb, void *user_data) MONO_INTERNAL;
 void mono_sgen_los_iterate_live_block_ranges (sgen_cardtable_block_callback callback) MONO_INTERNAL;
 void mono_sgen_los_scan_card_table (SgenGrayQueue *queue) MONO_INTERNAL;
+void sgen_major_collector_scan_card_table (SgenGrayQueue *queue) MONO_INTERNAL;
 FILE *mono_sgen_get_logfile (void) MONO_INTERNAL;
 
 /* nursery allocator */