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:
authorZoltan Varga <vargaz@gmail.com>2012-12-05 03:58:02 +0400
committerZoltan Varga <vargaz@gmail.com>2012-12-05 03:58:02 +0400
commitd7280785f1a21ef0c1982a1d82dd1c765d023c67 (patch)
tree9b454c3953a874e0b6dc6ada30761d9f779f9bb9
parentd1bf04d303bed4e5cd762f483519b9ccf2882f6c (diff)
Add support for interior pointers for oldspace objects to describe_ptr ().
-rw-r--r--mono/metadata/sgen-debug.c11
-rw-r--r--mono/metadata/sgen-gc.h2
-rw-r--r--mono/metadata/sgen-major-copying.c5
-rw-r--r--mono/metadata/sgen-marksweep.c15
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;
}