OSDN Git Service

* mf-runtime.c (__mfu_unregister): Warning fix for char unsigned.
[pf3gnuchains/gcc-fork.git] / libmudflap / mf-hooks3.c
index 6a14cb2..f980c9b 100644 (file)
@@ -41,7 +41,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #if !defined(__FreeBSD__) && !defined(__APPLE__)
 #define _POSIX_SOURCE
 #endif /* Some BSDs break <sys/socket.h> if this is defined. */
 #if !defined(__FreeBSD__) && !defined(__APPLE__)
 #define _POSIX_SOURCE
 #endif /* Some BSDs break <sys/socket.h> if this is defined. */
-#define _GNU_SOURCE 
+#define _GNU_SOURCE
 #define _XOPEN_SOURCE
 #define _BSD_TYPES
 #define __EXTENSIONS__
 #define _XOPEN_SOURCE
 #define _BSD_TYPES
 #define __EXTENSIONS__
@@ -125,7 +125,7 @@ static unsigned __mf_pthread_info_idx[LIBMUDFLAPTH_THREADS_MAX];
 
 /* Find any old empty entry in __mf_pthread_info; mark it used and
    return it.  Return NULL if there are no more available slots.  */
 
 /* Find any old empty entry in __mf_pthread_info; mark it used and
    return it.  Return NULL if there are no more available slots.  */
-struct pthread_info* 
+struct pthread_info*
 __mf_allocate_blank_threadinfo (unsigned* idx)
 {
   static unsigned probe = LIBMUDFLAPTH_THREADS_MAX-1;
 __mf_allocate_blank_threadinfo (unsigned* idx)
 {
   static unsigned probe = LIBMUDFLAPTH_THREADS_MAX-1;
@@ -158,7 +158,7 @@ __mf_allocate_blank_threadinfo (unsigned* idx)
        }
     }
   while (probe != probe_at_start);
        }
     }
   while (probe != probe_at_start);
-  
+
   rc = pthread_mutex_unlock (& mutex);
   assert (rc == 0);
   return NULL;
   rc = pthread_mutex_unlock (& mutex);
   assert (rc == 0);
   return NULL;
@@ -172,8 +172,12 @@ __mf_allocate_blank_threadinfo (unsigned* idx)
    making an early call into libmudflap.  In these cases, create a new
    entry.  If not it's not the main thread, put it into reentrant
    initial state.
    making an early call into libmudflap.  In these cases, create a new
    entry.  If not it's not the main thread, put it into reentrant
    initial state.
+
+   NB: VERBOSE_TRACE type functions are not generally safe to call
+   from this context, since a new thread might just be "booting up",
+   making printf unsafe to call.
 */
 */
-static struct pthread_info* 
+static struct pthread_info*
 __mf_find_threadinfo ()
 {
   pthread_t it = pthread_self ();
 __mf_find_threadinfo ()
 {
   pthread_t it = pthread_self ();
@@ -193,14 +197,14 @@ __mf_find_threadinfo ()
     else for (i = 0; i < LIBMUDFLAPTH_THREADS_MAX; i++)
       {
        struct pthread_info* pi2 = & __mf_pthread_info [i];
     else for (i = 0; i < LIBMUDFLAPTH_THREADS_MAX; i++)
       {
        struct pthread_info* pi2 = & __mf_pthread_info [i];
-       if (pi2->used_p && pi2->self == it) 
+       if (pi2->used_p && pi2->self == it)
          {
            *hash = i;
            result = pi2;
            break;
          }
       }
          {
            *hash = i;
            result = pi2;
            break;
          }
       }
-  }    
+  }
 
   if (result == NULL)
     {
 
   if (result == NULL)
     {
@@ -225,7 +229,7 @@ __mf_find_threadinfo ()
          /* NB: leave stack-related fields unset, to avoid
             deallocation.  */
          main_thread_seen_p = 1;
          /* NB: leave stack-related fields unset, to avoid
             deallocation.  */
          main_thread_seen_p = 1;
-         VERBOSE_TRACE ("identified self as main thread\n");
+         /* VERBOSE_TRACE ("identified self as main thread\n"); */
        }
       else
        {
        }
       else
        {
@@ -236,15 +240,17 @@ __mf_find_threadinfo ()
          /* NB: leave stack-related fields unset, leaving pthread_create
             to fill them in for user threads, leaving them empty for
             other threads.  */
          /* NB: leave stack-related fields unset, leaving pthread_create
             to fill them in for user threads, leaving them empty for
             other threads.  */
-         VERBOSE_TRACE ("identified self as new aux or user thread\n");
+         /* VERBOSE_TRACE ("identified self as new aux or user thread\n"); */
        }
     }
 
   if (last != it)
     {
        }
     }
 
   if (last != it)
     {
-      VERBOSE_TRACE ("found threadinfo for %u, slot %u\n", 
+      /*
+      VERBOSE_TRACE ("found threadinfo for %u, slot %u\n",
                     (unsigned) it,
                     (unsigned) *hash);
                     (unsigned) it,
                     (unsigned) *hash);
+      */
       last = it;
     }
 
       last = it;
     }
 
@@ -265,7 +271,7 @@ __mf_state_perthread ()
 }
 
 
 }
 
 
-static void 
+static void
 __mf_pthread_cleanup (void *arg)
 {
   struct pthread_info *pi = arg;
 __mf_pthread_cleanup (void *arg)
 {
   struct pthread_info *pi = arg;
@@ -273,7 +279,7 @@ __mf_pthread_cleanup (void *arg)
   /* XXX: This unregistration is not safe on platforms where distinct
      threads share errno (or at least its virtual address).  */
   if (pi->thread_errno != NULL)
   /* XXX: This unregistration is not safe on platforms where distinct
      threads share errno (or at least its virtual address).  */
   if (pi->thread_errno != NULL)
-    __mf_unregister (pi->thread_errno, sizeof (int));
+    __mf_unregister (pi->thread_errno, sizeof (int), __MF_TYPE_GUESS);
 
   /* XXX: Only detached threads should designate themselves as dead
      here.  Non-detached threads are marked dead after their
 
   /* XXX: Only detached threads should designate themselves as dead
      here.  Non-detached threads are marked dead after their
@@ -296,11 +302,11 @@ __mf_pthread_spawner (void *arg)
   pi->state = active;
 
   VERBOSE_TRACE ("new user thread\n");
   pi->state = active;
 
   VERBOSE_TRACE ("new user thread\n");
-  
+
   if (__mf_opts.heur_std_data)
     {
       pi->thread_errno = & errno;
   if (__mf_opts.heur_std_data)
     {
       pi->thread_errno = & errno;
-      __mf_register (pi->thread_errno, sizeof (int), 
+      __mf_register (pi->thread_errno, sizeof (int),
                     __MF_TYPE_GUESS, "errno area (thread)");
       /* NB: we could use __MF_TYPE_STATIC above, but we guess that
         the thread errno is coming out of some dynamically allocated
                     __MF_TYPE_GUESS, "errno area (thread)");
       /* NB: we could use __MF_TYPE_STATIC above, but we guess that
         the thread errno is coming out of some dynamically allocated
@@ -321,7 +327,7 @@ __mf_pthread_spawner (void *arg)
 
     /* Signal the main thread to resume.  */
     psi->thread_info = pi;
 
     /* Signal the main thread to resume.  */
     psi->thread_info = pi;
-      
+
     result = (*user_fn)(user_arg);
   }
 
     result = (*user_fn)(user_arg);
   }
 
@@ -339,7 +345,7 @@ __mf_pthread_spawner (void *arg)
 #if PIC
 /* A special bootstrap variant. */
 int
 #if PIC
 /* A special bootstrap variant. */
 int
-__mf_0fn_pthread_create (pthread_t *thr, const pthread_attr_t *attr, 
+__mf_0fn_pthread_create (pthread_t *thr, const pthread_attr_t *attr,
                         void * (*start) (void *), void *arg)
 {
   return -1;
                         void * (*start) (void *), void *arg)
 {
   return -1;
@@ -348,12 +354,12 @@ __mf_0fn_pthread_create (pthread_t *thr, const pthread_attr_t *attr,
 
 
 #undef pthread_create
 
 
 #undef pthread_create
-WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr, 
+WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
         void * (*start) (void *), void *arg)
 {
   DECLARE(int, munmap, void *p, size_t l);
   DECLARE(void *, mmap, void *p, size_t l, int prot, int flags, int fd, off_t of);
         void * (*start) (void *), void *arg)
 {
   DECLARE(int, munmap, void *p, size_t l);
   DECLARE(void *, mmap, void *p, size_t l, int prot, int flags, int fd, off_t of);
-  DECLARE(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr, 
+  DECLARE(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
          void * (*start) (void *), void *arg);
   int result;
   pthread_attr_t override_attr;
          void * (*start) (void *), void *arg);
   int result;
   pthread_attr_t override_attr;
@@ -377,7 +383,7 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
 
       /* VERBOSE_TRACE ("thread %u pi %p stack cleanup deferred (%u)\n",
         (unsigned) pi->self, pi, pi->dead_p); */
 
       /* VERBOSE_TRACE ("thread %u pi %p stack cleanup deferred (%u)\n",
         (unsigned) pi->self, pi, pi->dead_p); */
-             
+
       /* Delay actual deallocation by a few cycles, try to discourage the
         race mentioned at the end of __mf_pthread_spawner().  */
       if (pi->dead_p)
       /* Delay actual deallocation by a few cycles, try to discourage the
         race mentioned at the end of __mf_pthread_spawner().  */
       if (pi->dead_p)
@@ -446,8 +452,8 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
 #endif
 
 #ifdef MF_MAP_ANON
 #endif
 
 #ifdef MF_MAP_ANON
-      override_stack = CALL_REAL (mmap, NULL, override_stacksize, 
-                                 PROT_READ|PROT_WRITE, 
+      override_stack = CALL_REAL (mmap, NULL, override_stacksize,
+                                 PROT_READ|PROT_WRITE,
                                  MAP_PRIVATE|MF_MAP_ANON,
                                  0, 0);
 #else
                                  MAP_PRIVATE|MF_MAP_ANON,
                                  0, 0);
 #else
@@ -459,8 +465,8 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
         if (zerofd == -1)
           override_stack = MAP_FAILED;
         else
         if (zerofd == -1)
           override_stack = MAP_FAILED;
         else
-          override_stack = CALL_REAL (mmap, NULL, override_stacksize, 
-                                      PROT_READ|PROT_WRITE, 
+          override_stack = CALL_REAL (mmap, NULL, override_stacksize,
+                                      PROT_READ|PROT_WRITE,
                                       MAP_PRIVATE, zerofd, 0);
       }
 #endif
                                       MAP_PRIVATE, zerofd, 0);
       }
 #endif
@@ -471,7 +477,7 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
          return -1;
        }
 
          return -1;
        }
 
-      VERBOSE_TRACE ("thread stack alloc %p size %lu\n", 
+      VERBOSE_TRACE ("thread stack alloc %p size %lu\n",
                     override_stack, (unsigned long) override_stacksize);
 
       /* Save the original allocated values for later deallocation.  */
                     override_stack, (unsigned long) override_stacksize);
 
       /* Save the original allocated values for later deallocation.  */
@@ -486,10 +492,10 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
       override_stack = (void *)
        (((uintptr_t) override_stack + override_stacksize - alignment - perturb)
         & (~(uintptr_t)(alignment-1)));
       override_stack = (void *)
        (((uintptr_t) override_stack + override_stacksize - alignment - perturb)
         & (~(uintptr_t)(alignment-1)));
-      
+
       /* XXX: consider using POSIX2K attr_setstack() */
       if (pthread_attr_setstackaddr (& override_attr, override_stack) != 0 ||
       /* XXX: consider using POSIX2K attr_setstack() */
       if (pthread_attr_setstackaddr (& override_attr, override_stack) != 0 ||
-         pthread_attr_setstacksize (& override_attr, 
+         pthread_attr_setstacksize (& override_attr,
                                     override_stacksize - alignment - perturb) != 0)
        {
          /* This should not happen.  */
                                     override_stacksize - alignment - perturb) != 0)
        {
          /* This should not happen.  */
@@ -503,12 +509,12 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
   {
     struct pthread_start_info psi;
     struct pthread_info *pi = NULL;
   {
     struct pthread_start_info psi;
     struct pthread_info *pi = NULL;
-    
+
     /* Fill in startup-control fields.  */
     psi.user_fn = start;
     psi.user_arg = arg;
     psi.thread_info = NULL;
     /* Fill in startup-control fields.  */
     psi.user_fn = start;
     psi.user_arg = arg;
     psi.thread_info = NULL;
-    
+
     /* Actually create the thread.  */
     __mf_state = reentrant;
     result = CALL_REAL (pthread_create, thr, & override_attr,
     /* Actually create the thread.  */
     __mf_state = reentrant;
     result = CALL_REAL (pthread_create, thr, & override_attr,
@@ -523,7 +529,7 @@ WRAPPER(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr,
       {
        volatile struct pthread_start_info *psip = & psi;
        pi = psip->thread_info;
       {
        volatile struct pthread_start_info *psip = & psi;
        pi = psip->thread_info;
-       if (pi != NULL) 
+       if (pi != NULL)
          break;
        sched_yield ();
       }
          break;
        sched_yield ();
       }
@@ -568,7 +574,7 @@ WRAPPER(int, pthread_join, pthread_t thr, void **rc)
   __mf_state = reentrant;
   result = CALL_REAL (pthread_join, thr, rc);
   __mf_state = active;
   __mf_state = reentrant;
   result = CALL_REAL (pthread_join, thr, rc);
   __mf_state = active;
-  
+
   return result;
 }
 
   return result;
 }
 
@@ -591,4 +597,5 @@ WRAPPER(void, pthread_exit, void *rc)
   /* __mf_state = reentrant; */
   CALL_REAL (pthread_exit, rc);
   /* NOTREACHED */
   /* __mf_state = reentrant; */
   CALL_REAL (pthread_exit, rc);
   /* NOTREACHED */
+  exit (0);  /* Satisfy noreturn attribute of pthread_exit.  */
 }
 }