]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
- Fast-track pthread_mutex_trylock(), even though programs which use
authorJulian Seward <jseward@acm.org>
Wed, 24 Apr 2002 19:51:31 +0000 (19:51 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 24 Apr 2002 19:51:31 +0000 (19:51 +0000)
  it extensively are probably badly designed -- they are polling.

- VG_(deliver_signals): return a Bool indicating if any signals
  really were delivered.  Used only to try and reduce excessive
  frequency of system sanity checks.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@135

coregrind/vg_include.h
coregrind/vg_scheduler.c
coregrind/vg_signals.c
vg_include.h
vg_scheduler.c
vg_signals.c

index 0c00e1ab8330cd7b7977d04cab45218a50c7b97c..19b635fb106510468571c07d6d6524b3c3ebce17 100644 (file)
@@ -626,7 +626,7 @@ extern Int     VG_(longjmpd_on_signal);
 
 extern void VG_(sigstartup_actions) ( void );
 
-extern void VG_(deliver_signals) ( ThreadId );
+extern Bool VG_(deliver_signals) ( ThreadId );
 extern void VG_(unblock_host_signal) ( Int sigNo );
 
 
index a8d575e8798d7b0f6c250edd6cad58ad72874747..d95ebf75fec2902bd7fc2d61e8ac7e659443ef94 100644 (file)
@@ -672,6 +672,10 @@ Bool maybe_do_trivial_clientreq ( ThreadId tid )
          do_pthread_mutex_lock( tid, False, (void *)(arg[1]) );
          return True;
 
+      case VG_USERREQ__PTHREAD_MUTEX_TRYLOCK:
+         do_pthread_mutex_lock( tid, True, (void *)(arg[1]) );
+         return True;
+
       default:
          /* Too hard; wimp out. */
          return False;
@@ -1095,6 +1099,7 @@ VgSchedReturnCode VG_(scheduler) ( void )
    Int      request_code, done_this_time, n_in_fdwait_or_sleep;
    Char     msg_buf[100];
    Addr     trans_addr;
+   Bool     sigs_delivered;
 
    /* For the LRU structures, records when the epoch began. */
    ULong lru_epoch_started_at = 0;
@@ -1155,8 +1160,9 @@ VgSchedReturnCode VG_(scheduler) ( void )
             even if, as a result, it has missed the unlocking of it.
             Potential deadlock.  This sounds all very strange, but the
             POSIX standard appears to require this behaviour.  */
-         VG_(deliver_signals)( 1 /*HACK*/ );
-         VG_(do_sanity_checks)( 1 /*HACK*/, False );
+         sigs_delivered = VG_(deliver_signals)( 1 /*HACK*/ );
+        if (sigs_delivered)
+            VG_(do_sanity_checks)( 1 /*HACK*/, False );
 
          /* Try and find a thread (tid) to run. */
          tid_next = tid;
@@ -2335,18 +2341,6 @@ void do_nontrivial_clientreq ( ThreadId tid )
          do_pthread_join( tid, arg[1], (void**)(arg[2]) );
          break;
 
-      case VG_USERREQ__PTHREAD_MUTEX_LOCK:
-         do_pthread_mutex_lock( tid, False, (pthread_mutex_t *)(arg[1]) );
-         break;
-
-      case VG_USERREQ__PTHREAD_MUTEX_TRYLOCK:
-         do_pthread_mutex_lock( tid, True, (pthread_mutex_t *)(arg[1]) );
-         break;
-
-      case VG_USERREQ__PTHREAD_MUTEX_UNLOCK:
-         do_pthread_mutex_unlock( tid, (pthread_mutex_t *)(arg[1]) );
-         break;
-
       case VG_USERREQ__PTHREAD_CANCEL:
          do_pthread_cancel( tid, (pthread_t)(arg[1]) );
          break;
index fd89bde39836524418aa5cae7882b9155d457713..d0359767e5989f536505fa475b3935d46b940b57 100644 (file)
@@ -304,8 +304,8 @@ Bool VG_(signal_returns) ( ThreadId tid )
 
 
 /* Deliver all pending signals, by building stack frames for their
-   handlers. */
-void VG_(deliver_signals) ( ThreadId tid )
+   handlers.  Return True if any signals were delivered. */
+Bool VG_(deliver_signals) ( ThreadId tid )
 {
    vki_ksigset_t  saved_procmask;
    Int            sigNo;
@@ -322,7 +322,7 @@ void VG_(deliver_signals) ( ThreadId tid )
       if (VG_(sigpending)[sigNo] != VG_SIGIDLE &&
           VG_(sigpending)[sigNo] != VG_SIGRUNNING) found = True;
 
-   if (!found) return;
+   if (!found) return False;
 
    /* Now we have to do it properly.  Get exclusive access by
       blocking all the host's signals.  That means vg_oursignalhandler
@@ -351,7 +351,7 @@ void VG_(deliver_signals) ( ThreadId tid )
 
    /* Unlock and return. */
    VG_(restore_host_signals)( &saved_procmask );
-   return;
+   return True;
 }
 
 
index 0c00e1ab8330cd7b7977d04cab45218a50c7b97c..19b635fb106510468571c07d6d6524b3c3ebce17 100644 (file)
@@ -626,7 +626,7 @@ extern Int     VG_(longjmpd_on_signal);
 
 extern void VG_(sigstartup_actions) ( void );
 
-extern void VG_(deliver_signals) ( ThreadId );
+extern Bool VG_(deliver_signals) ( ThreadId );
 extern void VG_(unblock_host_signal) ( Int sigNo );
 
 
index a8d575e8798d7b0f6c250edd6cad58ad72874747..d95ebf75fec2902bd7fc2d61e8ac7e659443ef94 100644 (file)
@@ -672,6 +672,10 @@ Bool maybe_do_trivial_clientreq ( ThreadId tid )
          do_pthread_mutex_lock( tid, False, (void *)(arg[1]) );
          return True;
 
+      case VG_USERREQ__PTHREAD_MUTEX_TRYLOCK:
+         do_pthread_mutex_lock( tid, True, (void *)(arg[1]) );
+         return True;
+
       default:
          /* Too hard; wimp out. */
          return False;
@@ -1095,6 +1099,7 @@ VgSchedReturnCode VG_(scheduler) ( void )
    Int      request_code, done_this_time, n_in_fdwait_or_sleep;
    Char     msg_buf[100];
    Addr     trans_addr;
+   Bool     sigs_delivered;
 
    /* For the LRU structures, records when the epoch began. */
    ULong lru_epoch_started_at = 0;
@@ -1155,8 +1160,9 @@ VgSchedReturnCode VG_(scheduler) ( void )
             even if, as a result, it has missed the unlocking of it.
             Potential deadlock.  This sounds all very strange, but the
             POSIX standard appears to require this behaviour.  */
-         VG_(deliver_signals)( 1 /*HACK*/ );
-         VG_(do_sanity_checks)( 1 /*HACK*/, False );
+         sigs_delivered = VG_(deliver_signals)( 1 /*HACK*/ );
+        if (sigs_delivered)
+            VG_(do_sanity_checks)( 1 /*HACK*/, False );
 
          /* Try and find a thread (tid) to run. */
          tid_next = tid;
@@ -2335,18 +2341,6 @@ void do_nontrivial_clientreq ( ThreadId tid )
          do_pthread_join( tid, arg[1], (void**)(arg[2]) );
          break;
 
-      case VG_USERREQ__PTHREAD_MUTEX_LOCK:
-         do_pthread_mutex_lock( tid, False, (pthread_mutex_t *)(arg[1]) );
-         break;
-
-      case VG_USERREQ__PTHREAD_MUTEX_TRYLOCK:
-         do_pthread_mutex_lock( tid, True, (pthread_mutex_t *)(arg[1]) );
-         break;
-
-      case VG_USERREQ__PTHREAD_MUTEX_UNLOCK:
-         do_pthread_mutex_unlock( tid, (pthread_mutex_t *)(arg[1]) );
-         break;
-
       case VG_USERREQ__PTHREAD_CANCEL:
          do_pthread_cancel( tid, (pthread_t)(arg[1]) );
          break;
index fd89bde39836524418aa5cae7882b9155d457713..d0359767e5989f536505fa475b3935d46b940b57 100644 (file)
@@ -304,8 +304,8 @@ Bool VG_(signal_returns) ( ThreadId tid )
 
 
 /* Deliver all pending signals, by building stack frames for their
-   handlers. */
-void VG_(deliver_signals) ( ThreadId tid )
+   handlers.  Return True if any signals were delivered. */
+Bool VG_(deliver_signals) ( ThreadId tid )
 {
    vki_ksigset_t  saved_procmask;
    Int            sigNo;
@@ -322,7 +322,7 @@ void VG_(deliver_signals) ( ThreadId tid )
       if (VG_(sigpending)[sigNo] != VG_SIGIDLE &&
           VG_(sigpending)[sigNo] != VG_SIGRUNNING) found = True;
 
-   if (!found) return;
+   if (!found) return False;
 
    /* Now we have to do it properly.  Get exclusive access by
       blocking all the host's signals.  That means vg_oursignalhandler
@@ -351,7 +351,7 @@ void VG_(deliver_signals) ( ThreadId tid )
 
    /* Unlock and return. */
    VG_(restore_host_signals)( &saved_procmask );
-   return;
+   return True;
 }