#undef PACKAGE_VERSION
#include "mono/utils/mono-compiler.h"
-#ifdef MONO_DEBUGGER_SUPPORTED
-#include "include/libgc-mono-debugger.h"
-#endif
-
#ifdef NACL
volatile int __nacl_thread_suspension_needed = 0;
pthread_t nacl_thread_parker = -1;
pthread_t GC_stopping_thread;
int GC_stopping_pid;
-#ifdef PLATFORM_ANDROID
+#ifdef HOST_ANDROID
static
int android_thread_kill(pid_t tid, int sig)
{
GC_printf1("Sending suspend signal to 0x%lx\n", p -> id);
#endif
-#ifndef PLATFORM_ANDROID
+#ifndef HOST_ANDROID
result = pthread_kill(p -> id, SIG_SUSPEND);
#else
result = android_thread_kill(p -> kernel_id, SIG_SUSPEND);
#elif __arm__
#define NACL_STORE_REGS() \
- do { \
- __asm__ __volatile__ ("push {r4-r12,lr}");\
- __asm__ __volatile__ ("mov r0, %0" : : "r" (&nacl_gc_thread_self->stop_info.stack_ptr)); \
- __asm__ __volatile__ ("bic r0, r0, #0xc0000000");\
- __asm__ __volatile__ ("str sp, [r0]");\
- memcpy(nacl_gc_thread_self->stop_info.reg_storage, nacl_gc_thread_self->stop_info.stack_ptr, NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));\
- __asm__ __volatile__ ("add sp, sp, #40");\
- __asm__ __volatile__ ("bic sp, sp, #0xc0000000");\
+ do { \
+ __asm__ __volatile__ ( \
+ ".align 4\n\t" \
+ "bic %0, %0, #0xc0000000\n\t" \
+ "str sp, [%0]\n\t" \
+ "bic %1, %1, #0xc0000000\n\t" \
+ "stm %1, {r4-r8,r10-r12,lr}\n\t" \
+ : \
+ : "r" (&nacl_gc_thread_self->stop_info.stack_ptr), \
+ "r"(nacl_gc_thread_self->stop_info.reg_storage) \
+ : "memory"); \
} while (0)
#else
{
if (GC_notify_event)
GC_notify_event (GC_EVENT_PRE_STOP_WORLD);
+ GC_process_togglerefs ();
/* 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, */
/* 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();
GC_printf1("Sending restart signal to 0x%lx\n", p -> id);
#endif
-#ifndef PLATFORM_ANDROID
+#ifndef HOST_ANDROID
result = pthread_kill(p -> id, SIG_THR_RESTART);
#else
result = android_thread_kill(p -> kernel_id, SIG_THR_RESTART);
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 ();
}
/* 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_get_stack_ptr (void)
-{
- GC_thread me;
-
- me = GC_lookup_thread (pthread_self ());
- return &me->stop_info.stack_ptr;
-}
-
-#endif
-
#endif