s390x-codegen.h - Define s390_SP and s390_BP
authorNeale Ferguson <neale@sinenomine.net>
Mon, 2 Apr 2012 17:30:43 +0000 (13:30 -0400)
committerNeale Ferguson <neale@sinenomine.net>
Mon, 2 Apr 2012 17:30:43 +0000 (13:30 -0400)
sgen-major-copy-object.h - Correct assertion test
sgen-os-posix.c - Prevent race condition between restarting and suspending a thread

mono/arch/s390x/s390x-codegen.h
mono/metadata/sgen-major-copy-object.h
mono/metadata/sgen-os-posix.c

index 7f74e3d740d4e2175c9c7af43310046d6ee81d5a..d3292bffb907295510f3f20f3602fc1955d63153 100644 (file)
@@ -146,6 +146,8 @@ typedef enum {
 #define s390_is_uimm12(val)            ((glong)val >= 0 && (glong)val <= 4095)
 
 #define STK_BASE                       s390_r15
+#define S390_SP                                s390_r15
+#define S390_FP                                s390_r11
 #define S390_MINIMAL_STACK_SIZE                160
 #define S390_REG_SAVE_OFFSET           48
 #define S390_PARM_SAVE_OFFSET          16
index 40bbe2561fb3695dca1f3f22542b5927b505d4d8..2ff7853fd2f4614ca47b84b85a8f15d8dc2bb2d1 100644 (file)
@@ -154,7 +154,7 @@ nopar_copy_object (void **obj_slot, SgenGrayQueue *queue)
         */
 
        if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj))) {
-               DEBUG (9, g_assert (((MonoVTable*)SGEN_LOAD_VTABLE(obj))->gc_descr));
+               DEBUG (9, g_assert ((*(MonoVTable**)SGEN_LOAD_VTABLE(obj))->gc_descr));
                DEBUG (9, fprintf (gc_debug_file, " (already forwarded to %p)\n", forwarded));
                HEAVY_STAT (++stat_nursery_copy_object_failed_forwarded);
                *obj_slot = forwarded;
index 5a1f53dbc982a798153f754b68e5202fdffd6cc7..fc05f4e624bd1fd4938f36119bec60e883162da2 100644 (file)
@@ -51,6 +51,7 @@ static MonoSemType suspend_ack_semaphore;
 static MonoSemType *suspend_ack_semaphore_ptr;
 
 static sigset_t suspend_signal_mask;
+static sigset_t suspend_ack_signal_mask;
 
 static void
 suspend_thread (SgenThreadInfo *info, void *context)
@@ -104,6 +105,14 @@ suspend_thread (SgenThreadInfo *info, void *context)
                mono_gc_get_gc_callbacks ()->thread_suspend_func (info->runtime_data, context);
 
        DEBUG (4, fprintf (gc_debug_file, "Posting suspend_ack_semaphore for suspend from %p %p\n", info, (gpointer)mono_native_thread_id_get ()));
+
+       /*
+       Block the restart signal. 
+       We need to block the restart signal while posting to the suspend_ack semaphore or we race to sigsuspend,
+       which might miss the signal and get stuck.
+       */
+       pthread_sigmask (SIG_BLOCK, &suspend_ack_signal_mask, NULL);
+
        /* notify the waiting thread */
        MONO_SEM_POST (suspend_ack_semaphore_ptr);
        info->stop_count = stop_count;
@@ -114,6 +123,9 @@ suspend_thread (SgenThreadInfo *info, void *context)
                sigsuspend (&suspend_signal_mask);
        } while (info->signal != restart_signal_num && info->doing_handshake);
 
+       /* Unblock the restart signal. */
+       pthread_sigmask (SIG_UNBLOCK, &suspend_ack_signal_mask, NULL);
+
        DEBUG (4, fprintf (gc_debug_file, "Posting suspend_ack_semaphore for resume from %p %p\n", info, (gpointer)mono_native_thread_id_get ()));
        /* notify the waiting thread */
        MONO_SEM_POST (suspend_ack_semaphore_ptr);
@@ -145,6 +157,15 @@ restart_handler (int sig)
        int old_errno = errno;
 
        info = mono_thread_info_current ();
+       /*
+       If the thread info is null is means we're currently in the process of cleaning up,
+       the pthread destructor has already kicked in and it has explicitly invoked the suspend handler.
+       
+       This means this thread has been suspended, TLS is dead, so the only option we have is to
+       rely on pthread_self () and seatch over the thread list.
+       */
+       if (!info)
+               info = mono_thread_info_lookup (pthread_self ());
 
        /*
         * If a thread is dying there might be no thread info.  In
@@ -154,7 +175,6 @@ restart_handler (int sig)
                info->signal = restart_signal_num;
                DEBUG (4, fprintf (gc_debug_file, "Restart handler in %p %p\n", info, (gpointer)mono_native_thread_id_get ()));
        }
-
        errno = old_errno;
 }
 
@@ -254,6 +274,10 @@ mono_sgen_os_init (void)
 
        sigfillset (&suspend_signal_mask);
        sigdelset (&suspend_signal_mask, restart_signal_num);
+
+       sigemptyset (&suspend_ack_signal_mask);
+       sigaddset (&suspend_ack_signal_mask, restart_signal_num);
+       
 }
 
 int