2008-05-07 Robert Jordan <robertj@gmx.net>
[mono.git] / libgc / pthread_stop_world.c
index 6291d47fb2d8c2f52906b1257abdfd4057667295..04eb3712c263d9831af128e93c174c61e813635c 100644 (file)
@@ -9,6 +9,18 @@
 #include <errno.h>
 #include <unistd.h>
 
+/* work around a dlopen issue (bug #75390), undefs to avoid warnings with redefinitions */
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#include "mono/utils/mono-compiler.h"
+
+#ifdef MONO_DEBUGGER_SUPPORTED
+#include "include/libgc-mono-debugger.h"
+#endif
+
 #if DEBUG_THREADS
 
 #ifndef NSIG
@@ -402,6 +414,8 @@ static void pthread_stop_world()
 /* Caller holds allocation lock.       */
 void GC_stop_world()
 {
+    if (GC_notify_event)
+        GC_notify_event (GC_EVENT_PRE_STOP_WORLD);
     /* Make sure all free list construction has stopped before we start. */
     /* No new construction can start, since free list construction is  */
     /* required to acquire and release the GC lock before it starts,   */
@@ -412,13 +426,17 @@ void GC_stop_world()
       /* We should have previously waited for it to become zero. */
 #   endif /* PARALLEL_MARK */
     ++GC_stop_count;
+#ifdef MONO_DEBUGGER_SUPPORTED
     if (gc_thread_vtable && gc_thread_vtable->stop_world)
        gc_thread_vtable->stop_world ();
     else
+#endif
        pthread_stop_world ();
 #   ifdef PARALLEL_MARK
       GC_release_mark_lock();
 #   endif
+    if (GC_notify_event)
+        GC_notify_event (GC_EVENT_POST_STOP_WORLD);
 }
 
 /* Caller holds allocation lock, and has held it continuously since    */
@@ -435,6 +453,8 @@ static void pthread_start_world()
 #   if DEBUG_THREADS
       GC_printf0("World starting\n");
 #   endif
+    if (GC_notify_event)
+        GC_notify_event (GC_EVENT_PRE_START_WORLD);
 
     for (i = 0; i < THREAD_TABLE_SZ; i++) {
       for (p = GC_threads[i]; p != 0; p = p -> next) {
@@ -474,6 +494,8 @@ static void pthread_start_world()
        }
     }
   
+    if (GC_notify_event)
+        GC_notify_event (GC_EVENT_POST_START_WORLD);
     #if DEBUG_THREADS
       GC_printf0("World started\n");
     #endif
@@ -481,9 +503,11 @@ static void pthread_start_world()
 
 void GC_start_world()
 {
+#ifdef MONO_DEBUGGER_SUPPORTED
     if (gc_thread_vtable && gc_thread_vtable->start_world)
        gc_thread_vtable->start_world();
     else
+#endif
        pthread_start_world ();
 }
 
@@ -533,28 +557,27 @@ static void pthread_stop_init() {
 /* We hold the allocation lock.        */
 void GC_stop_init()
 {
+#ifdef MONO_DEBUGGER_SUPPORTED
     if (gc_thread_vtable && gc_thread_vtable->initialize)
        gc_thread_vtable->initialize ();
     else
+#endif
        pthread_stop_init ();
 }
 
+#ifdef MONO_DEBUGGER_SUPPORTED
+
 GCThreadFunctions *gc_thread_vtable = NULL;
 
-void
-GC_mono_debugger_add_all_threads (void)
+void *
+GC_mono_debugger_get_stack_ptr (void)
 {
-    GC_thread p;
-    int i;
+       GC_thread me;
 
-    if (gc_thread_vtable && gc_thread_vtable->thread_created) {
-       for (i = 0; i < THREAD_TABLE_SZ; i++) {
-           for (p = GC_threads[i]; p != 0; p = p -> next) {
-               gc_thread_vtable->thread_created (p->id, &p->stop_info.stack_ptr);
-           }
-       }
-    }
+       me = GC_lookup_thread (pthread_self ());
+       return &me->stop_info.stack_ptr;
 }
 
+#endif
 
 #endif