diff options
author | Mark Probst <mark.probst@gmail.com> | 2010-05-28 09:21:24 +0400 |
---|---|---|
committer | Mark Probst <mark.probst@gmail.com> | 2010-05-28 09:21:24 +0400 |
commit | 4b0cd3b6179e663ea4472844ab1f244add0a553c (patch) | |
tree | 1d233699027de796da5870baed9693f394622979 | |
parent | 7a78c6fd46ed5709922c9ad6e92fa9e69c89012b (diff) |
2010-05-28 Mark Probst <mark.probst@gmail.com>
* sgen-gc.c: More and better remset consistency checks.
svn path=/trunk/mono/; revision=158076
-rw-r--r-- | mono/metadata/ChangeLog | 4 | ||||
-rw-r--r-- | mono/metadata/sgen-gc.c | 35 |
2 files changed, 39 insertions, 0 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 7a4748bc68d..031782954dd 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,7 @@ +2010-05-28 Mark Probst <mark.probst@gmail.com> + + * sgen-gc.c: More and better remset consistency checks. + 2010-05-28 Rodrigo Kumpera <rkumpera@novell.com> * sgen-gc.c: Add a note about the int[] trick to avoid some diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 1691c436563..e8519b7d42c 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1040,6 +1040,7 @@ static void mono_gc_register_disappearing_link (MonoObject *obj, void **link, gb void describe_ptr (char *ptr); static void check_consistency (void); +static void check_major_refs (void); static void check_section_scan_starts (GCMemSection *section); static void check_scan_starts (void); static void check_for_xdomain_refs (void); @@ -3359,6 +3360,9 @@ collect_nursery (size_t requested_size) time_minor_fragment_creation += TV_ELAPSED_MS (atv, btv); DEBUG (2, fprintf (gc_debug_file, "Fragment creation: %d usecs, %zd bytes available\n", TV_ELAPSED (atv, btv), fragment_total)); + if (consistency_check_at_minor_collection) + check_major_refs (); + major_finish_nursery_collection (); TV_GETTIME (all_btv); @@ -6887,6 +6891,8 @@ check_consistency_callback (char *start, size_t size, void *dummy) static void check_consistency (void) { + LOSObject *bigobj; + // Need to add more checks missing_remsets = FALSE; @@ -6896,6 +6902,9 @@ check_consistency (void) // Check that oldspace->newspace pointers are registered with the collector major_iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)check_consistency_callback, NULL); + for (bigobj = los_object_list; bigobj; bigobj = bigobj->next) + check_consistency_callback (bigobj->data, bigobj->size, NULL); + DEBUG (1, fprintf (gc_debug_file, "Heap consistency check done.\n")); #ifdef BINARY_PROTOCOL @@ -6904,6 +6913,31 @@ check_consistency (void) g_assert (!missing_remsets); } + +#undef HANDLE_PTR +#define HANDLE_PTR(ptr,obj) do { \ + if (*(ptr)) \ + g_assert (LOAD_VTABLE (*(ptr))); \ + } while (0) + +static void +check_major_refs_callback (char *start, size_t size, void *dummy) +{ +#define SCAN_OBJECT_ACTION +#include "sgen-scan-object.h" +} + +static void +check_major_refs (void) +{ + LOSObject *bigobj; + + major_iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)check_major_refs_callback, NULL); + + for (bigobj = los_object_list; bigobj; bigobj = bigobj->next) + check_major_refs_callback (bigobj->data, bigobj->size, NULL); +} + /* Check that the reference is valid */ #undef HANDLE_PTR #define HANDLE_PTR(ptr,obj) do { \ @@ -7253,6 +7287,7 @@ mono_gc_base_init (void) collect_before_allocs = TRUE; } else if (!strcmp (opt, "check-at-minor-collections")) { consistency_check_at_minor_collection = TRUE; + nursery_clear_policy = CLEAR_AT_GC; } else if (!strcmp (opt, "xdomain-checks")) { xdomain_checks = TRUE; } else if (!strcmp (opt, "clear-at-gc")) { |