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
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 );
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;
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;
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;
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;
/* 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;
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
/* Unlock and return. */
VG_(restore_host_signals)( &saved_procmask );
- return;
+ return True;
}
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 );
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;
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;
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;
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;
/* 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;
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
/* Unlock and return. */
VG_(restore_host_signals)( &saved_procmask );
- return;
+ return True;
}