[sgen] Binary protocol entries for block alloc/free/change state.
authorMark Probst <mark.probst@gmail.com>
Mon, 26 Jan 2015 17:26:55 +0000 (12:26 -0500)
committerMark Probst <mark.probst@gmail.com>
Thu, 2 Apr 2015 23:41:24 +0000 (16:41 -0700)
mono/metadata/sgen-marksweep.c
mono/metadata/sgen-protocol-def.h

index 9519f70367d0bacce08a7fabb89883baceae34e1..b976ef57851407b88f9bfe80c0ee77fcfc382faa 100644 (file)
@@ -376,6 +376,8 @@ ms_free_block (void *block)
        } while (SGEN_CAS_PTR (&empty_blocks, block, empty) != empty);
 
        SGEN_ATOMIC_ADD_P (num_empty_blocks, 1);
+
+       binary_protocol_block_free (block, MS_BLOCK_SIZE);
 }
 
 //#define MARKSWEEP_CONSISTENCY_CHECK
@@ -504,6 +506,8 @@ ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
 
        update_heap_boundaries_for_block (info);
 
+       binary_protocol_block_alloc (info, MS_BLOCK_SIZE);
+
        /* build free list */
        obj_start = MS_BLOCK_FOR_BLOCK_INFO (info) + MS_BLOCK_SKIP;
        info->free_list = (void**)obj_start;
@@ -1177,7 +1181,10 @@ static gboolean
 try_set_block_state (MSBlockInfo *block, gint32 new_state, gint32 expected_state)
 {
        gint32 old_state = SGEN_CAS (&block->state, new_state, expected_state);
-       return old_state == expected_state;
+       gboolean success = old_state == expected_state;
+       if (success)
+               binary_protocol_block_set_state (block, MS_BLOCK_SIZE, old_state, new_state);
+       return success;
 }
 
 /*
index bd449e10dfc12e7e41d30ada3a1225f9e2deed14..f9196ffe5b99a11a9899f6be2eb335f24387ec30 100644 (file)
@@ -71,6 +71,27 @@ MATCH_INDEX (BINARY_PROTOCOL_MATCH)
 IS_VTABLE_MATCH (FALSE)
 END_PROTOCOL_ENTRY
 
+BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_block_alloc, TYPE_POINTER, addr, TYPE_SIZE, size)
+DEFAULT_PRINT ()
+IS_ALWAYS_MATCH (FALSE)
+MATCH_INDEX (matches_interval (ptr, entry->addr, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH)
+IS_VTABLE_MATCH (FALSE)
+END_PROTOCOL_ENTRY_HEAVY
+
+BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_block_free, TYPE_POINTER, addr, TYPE_SIZE, size)
+DEFAULT_PRINT ()
+IS_ALWAYS_MATCH (FALSE)
+MATCH_INDEX (matches_interval (ptr, entry->addr, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH)
+IS_VTABLE_MATCH (FALSE)
+END_PROTOCOL_ENTRY_HEAVY
+
+BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_block_set_state, TYPE_POINTER, addr, TYPE_SIZE, size, TYPE_INT, old, TYPE_INT, new)
+DEFAULT_PRINT ()
+IS_ALWAYS_MATCH (FALSE)
+MATCH_INDEX (matches_interval (ptr, entry->addr, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH)
+IS_VTABLE_MATCH (FALSE)
+END_PROTOCOL_ENTRY_HEAVY
+
 BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_alloc, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size)
 DEFAULT_PRINT ()
 IS_ALWAYS_MATCH (FALSE)