[sgen] Binary protocol entry for stack scanning.
authorMark Probst <mark.probst@gmail.com>
Tue, 28 Apr 2015 22:10:00 +0000 (15:10 -0700)
committerMark Probst <mark.probst@gmail.com>
Wed, 29 Apr 2015 21:54:15 +0000 (14:54 -0700)
mono/metadata/sgen-gc.c
mono/metadata/sgen-mono.c
mono/metadata/sgen-protocol-def.h

index 0250c1147ea623cb9c0ea80b9e7cf5c9a40a3247..e8dcace5c0752800ac5b8dd5abe4b9bc0349031d 100644 (file)
@@ -2690,7 +2690,6 @@ sgen_thread_unregister (SgenThreadInfo *p)
        sgen_client_thread_unregister (p);
 }
 
-
 /*
  * ######################################################################
  * ########  Write barriers
index c1f50f6ebc6f94eb5e457f7b3ddac8c0bcc7aa28..ace75d9660c0c035c38fcec011c59412d27fd193 100644 (file)
@@ -2268,18 +2268,23 @@ sgen_client_scan_thread_data (void *start_nursery, void *end_nursery, gboolean p
        scan_area_arg_end = end_nursery;
 
        FOREACH_THREAD (info) {
+               int skip_reason = 0;
                if (info->client_info.skip) {
                        SGEN_LOG (3, "Skipping dead thread %p, range: %p-%p, size: %td", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start);
-                       continue;
-               }
-               if (info->client_info.gc_disabled) {
+                       skip_reason = 1;
+               } else if (info->client_info.gc_disabled) {
                        SGEN_LOG (3, "GC disabled for thread %p, range: %p-%p, size: %td", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start);
-                       continue;
-               }
-               if (!mono_thread_info_is_live (info)) {
+                       skip_reason = 2;
+               } else if (!mono_thread_info_is_live (info)) {
                        SGEN_LOG (3, "Skipping non-running thread %p, range: %p-%p, size: %td (state %x)", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start, info->client_info.info.thread_state);
-                       continue;
+                       skip_reason = 3;
                }
+
+               binary_protocol_scan_stack ((gpointer)mono_thread_info_get_tid (info), info->client_info.stack_start, info->client_info.stack_end, skip_reason);
+
+               if (skip_reason)
+                       continue;
+
                g_assert (info->client_info.suspend_done);
                SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %td, pinned=%zd", info, info->client_info.stack_start, info->client_info.stack_end, (char*)info->client_info.stack_end - (char*)info->client_info.stack_start, sgen_get_pinned_count ());
                if (mono_gc_get_gc_callbacks ()->thread_mark_func && !conservative_stack_mark) {
index cf3bf5962d1b50096259aa78c919bb02736b5a4a..a9aa12f72d8b492e141321bf18bf071b1e7249c6 100644 (file)
@@ -198,6 +198,13 @@ MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->ptr ? 1 : ptr == entry->value
 IS_VTABLE_MATCH (FALSE)
 END_PROTOCOL_ENTRY_HEAVY
 
+BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_scan_stack, TYPE_POINTER, thread, TYPE_POINTER, stack_start, TYPE_POINTER, stack_end, TYPE_INT, skip_reason)
+DEFAULT_PRINT ()
+IS_ALWAYS_MATCH (FALSE)
+MATCH_INDEX (ptr == entry->thread ? 0 : (ptr >= entry->stack_start && ptr < entry->stack_end) ? 1 : BINARY_PROTOCOL_NO_MATCH)
+IS_VTABLE_MATCH (FALSE)
+END_PROTOCOL_ENTRY_HEAVY
+
 BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_wbarrier, TYPE_POINTER, ptr, TYPE_POINTER, value, TYPE_POINTER, value_vtable)
 DEFAULT_PRINT ()
 IS_ALWAYS_MATCH (FALSE)