[sgen] Provide a function to wait for bridge processing to finish.
authorMark Probst <mark.probst@gmail.com>
Tue, 11 Sep 2012 19:25:38 +0000 (21:25 +0200)
committerMark Probst <mark.probst@gmail.com>
Tue, 11 Sep 2012 19:25:38 +0000 (21:25 +0200)
mono/metadata/sgen-bridge.c
mono/metadata/sgen-bridge.h

index 294e9b2587bedc7a906a5c4bbf0481b16d96acb6..be2cbf4db40bd2180fe47fa8949759991b84848e 100644 (file)
@@ -276,6 +276,20 @@ static MonoGCBridgeCallbacks bridge_callbacks;
 
 static int current_time;
 
+static gboolean bridge_processing_in_progress = FALSE;
+
+void
+mono_gc_wait_for_bridge_processing (void)
+{
+       if (!bridge_processing_in_progress)
+               return;
+
+       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_BRIDGE waiting for bridge processing to finish");
+
+       sgen_gc_lock ();
+       sgen_gc_unlock ();
+}
+
 void
 mono_gc_register_bridge_callbacks (MonoGCBridgeCallbacks *callbacks)
 {
@@ -539,6 +553,9 @@ sgen_bridge_processing_stw_step (void)
        if (!registered_bridges.size)
                return;
 
+       g_assert (!bridge_processing_in_progress);
+       bridge_processing_in_progress = TRUE;
+
        SGEN_TV_GETTIME (btv);
 
        /* first DFS pass */
@@ -573,6 +590,8 @@ sgen_bridge_processing_finish (void)
        if (!registered_bridges.size)
                return;
 
+       g_assert (bridge_processing_in_progress);
+
        SGEN_TV_GETTIME (atv);
 
        /* alloc and fill array of all entries */
@@ -753,6 +772,8 @@ sgen_bridge_processing_finish (void)
                dsf1_passes, dsf2_passes);
 
        step_1 = 0; /* We must cleanup since this value is used as an accumulator. */
+
+       bridge_processing_in_progress = FALSE;
 }
 
 static const char *bridge_class;
index 3fff4b7af73dc5fe60a564cada2d5a7ad95e1b08..1d7189e089f6bb67c74611b3aa84bf0926b09780 100644 (file)
@@ -51,6 +51,8 @@ typedef struct {
 
 void mono_gc_register_bridge_callbacks (MonoGCBridgeCallbacks *callbacks);
 
+void mono_gc_wait_for_bridge_processing (void);
+
 MONO_END_DECLS
 
 #endif