]> granicus.if.org Git - gc/commitdiff
More NACL updates
authorElijah Taylor <elijahtaylor@google.com>
Tue, 9 Aug 2011 20:03:46 +0000 (22:03 +0200)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 4 Mar 2012 12:02:29 +0000 (16:02 +0400)
include/private/gcconfig.h
pthread_stop_world.c
pthread_support.c

index 8ff4fbfbc0dd1f1f519f8cfc3acb4a6f978f7661..0d28d986f7c8061ec55f033eeccedb504e353172 100644 (file)
 #   ifdef NACL
 #      define OS_TYPE "NACL"
        extern int etext[];
-#      define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
+//#    define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
+#       define DATASTART ((ptr_t)0x10000000)
        extern int _end[];
 #      define DATAEND (_end)
 #      ifdef STACK_GRAN
index b1f98099d1e79e60937a2edebd00630d55df6216..3819693c45cea458812c159cb808312eeeec7e96 100644 (file)
@@ -461,6 +461,7 @@ static void pthread_stop_world()
 #else /* NACL */
     GC_thread p;
     int i;
+    int num_sleeps = 0;
 
     #if DEBUG_THREADS
     GC_printf1("pthread_stop_world: num_threads %d\n", nacl_num_gc_threads - 1);
@@ -470,6 +471,7 @@ static void pthread_stop_world()
     
     while (1) {
        #define NACL_PARK_WAIT_NANOSECONDS 100000
+        #define NANOS_PER_SECOND 1000000000
         int num_threads_parked = 0;
         struct timespec ts;
         int num_used = 0;
@@ -491,6 +493,10 @@ static void pthread_stop_world()
         GC_printf1("sleeping waiting for %d threads to park...\n", nacl_num_gc_threads - num_threads_parked - 1);
         #endif
         nanosleep(&ts, 0);
+        if (++num_sleeps > NANOS_PER_SECOND / NACL_PARK_WAIT_NANOSECONDS) {
+            GC_printf1("GC appears stalled waiting for %d threads to park...\n", nacl_num_gc_threads - num_threads_parked - 1);
+            num_sleeps = 0;
+        }
     }
 
 #endif /* NACL */
index 96e8a011b2ca5ece50e39695416fa5fdedeb56a5..4b3d825fbc7b4e4f9d4a1f0a37d995385a0199bf 100644 (file)
@@ -688,9 +688,14 @@ extern pthread_mutex_t nacl_thread_alloc_lock;
 extern __thread int nacl_thread_idx;
 extern __thread GC_thread nacl_gc_thread_self;
 
+extern void nacl_pre_syscall_hook();
+extern void nacl_post_syscall_hook();
+extern void nacl_register_gc_hooks(void (*pre)(), void (*post)());
+
 void nacl_initialize_gc_thread()
 {
     int i;
+    nacl_register_gc_hooks(nacl_pre_syscall_hook, nacl_post_syscall_hook);
     pthread_mutex_lock(&nacl_thread_alloc_lock);
     if (!nacl_thread_parking_inited)
     {