diff options
author | Zoltan Varga <vargaz@gmail.com> | 2012-12-05 03:58:02 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2012-12-05 03:58:02 +0400 |
commit | d7280785f1a21ef0c1982a1d82dd1c765d023c67 (patch) | |
tree | 9b454c3953a874e0b6dc6ada30761d9f779f9bb9 | |
parent | d1bf04d303bed4e5cd762f483519b9ccf2882f6c (diff) |
Add support for interior pointers for oldspace objects to describe_ptr ().
-rw-r--r-- | mono/metadata/sgen-debug.c | 11 | ||||
-rw-r--r-- | mono/metadata/sgen-gc.h | 2 | ||||
-rw-r--r-- | mono/metadata/sgen-major-copying.c | 5 | ||||
-rw-r--r-- | mono/metadata/sgen-marksweep.c | 15 |
4 files changed, 27 insertions, 6 deletions
diff --git a/mono/metadata/sgen-debug.c b/mono/metadata/sgen-debug.c index 274e7e76b76..b1255a6748d 100644 --- a/mono/metadata/sgen-debug.c +++ b/mono/metadata/sgen-debug.c @@ -76,8 +76,15 @@ describe_ptr (char *ptr) else printf ("Pointer is at offset 0x%x of object %p in LOS space.\n", (int)(ptr - start), start); ptr = start; - } else if (major_collector.ptr_is_in_non_pinned_space (ptr)) { - printf ("Pointer inside oldspace.\n"); + } else if (major_collector.ptr_is_in_non_pinned_space (ptr, &start)) { + if (ptr == start) + printf ("Pointer is the start of object %p in oldspace.\n", start); + else if (start) + printf ("Pointer is at offset 0x%x of object %p in oldspace.\n", (int)(ptr - start), start); + else + printf ("Pointer inside oldspace.\n"); + if (start) + ptr = start; } else if (major_collector.obj_is_from_pinned_alloc (ptr)) { printf ("Pointer is inside a pinned chunk.\n"); } else { diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index c17bd2fcf5a..7af57d69866 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -698,7 +698,7 @@ struct _SgenMajorCollector { void (*start_major_collection) (void); void (*finish_major_collection) (void); void (*have_computed_minor_collection_allowance) (void); - gboolean (*ptr_is_in_non_pinned_space) (char *ptr); + gboolean (*ptr_is_in_non_pinned_space) (char *ptr, char **start); gboolean (*obj_is_from_pinned_alloc) (char *obj); void (*report_pinned_memory_usage) (void); int (*get_num_major_sections) (void); diff --git a/mono/metadata/sgen-major-copying.c b/mono/metadata/sgen-major-copying.c index 2b44b47398e..22dafc4e03b 100644 --- a/mono/metadata/sgen-major-copying.c +++ b/mono/metadata/sgen-major-copying.c @@ -619,9 +619,12 @@ major_finish_major_collection (void) } static gboolean -major_ptr_is_in_non_pinned_space (char *ptr) +major_ptr_is_in_non_pinned_space (char *ptr, char **start) { GCMemSection *section; + + // FIXME: + *start = NULL; for (section = section_list; section;) { if (ptr >= section->data && ptr < section->data + section->size) return TRUE; diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index eeeefcc2152..6f440a87a6f 100644 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -892,13 +892,24 @@ major_is_object_live (char *obj) } static gboolean -major_ptr_is_in_non_pinned_space (char *ptr) +major_ptr_is_in_non_pinned_space (char *ptr, char **start) { MSBlockInfo *block; FOREACH_BLOCK (block) { - if (ptr >= block->block && ptr <= block->block + MS_BLOCK_SIZE) + if (ptr >= block->block && ptr <= block->block + MS_BLOCK_SIZE) { + int count = MS_BLOCK_FREE / block->obj_size; + int i; + + *start = NULL; + for (i = 0; i <= count; ++i) { + if (ptr >= MS_BLOCK_OBJ (block, i) && ptr < MS_BLOCK_OBJ (block, i + 1)) { + *start = MS_BLOCK_OBJ (block, i); + break; + } + } return !block->pinned; + } } END_FOREACH_BLOCK; return FALSE; } |