Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Probst <mark.probst@gmail.com>2010-05-28 09:21:24 +0400
committerMark Probst <mark.probst@gmail.com>2010-05-28 09:21:24 +0400
commit4b0cd3b6179e663ea4472844ab1f244add0a553c (patch)
tree1d233699027de796da5870baed9693f394622979
parent7a78c6fd46ed5709922c9ad6e92fa9e69c89012b (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/ChangeLog4
-rw-r--r--mono/metadata/sgen-gc.c35
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")) {