static
UInt run_thread_for_a_while ( ThreadId tid )
{
- UInt trc = 0;
+ volatile UInt trc = 0;
vg_assert(is_valid_tid(tid));
vg_assert(vg_threads[tid].status == VgTs_Runnable);
vg_assert(VG_(bbs_to_go) > 0);
static void VG_(oursignalhandler) ( Int sigNo )
{
+ Bool needs_to_be_delivered;
Int dummy_local;
vki_ksigset_t saved_procmask;
VG_(block_all_host_signals)( &saved_procmask );
+ needs_to_be_delivered = False;
+
if (VG_(sighandler)[sigNo] == NULL) {
if (VG_(clo_trace_signals)) {
VG_(add_to_msg)("unexpected!");
VG_(add_to_msg)("queued" );
VG_(end_msg)();
}
+ needs_to_be_delivered = True;
}
/* We've finished messing with the queue, so re-enable host
signals. */
VG_(restore_host_signals)( &saved_procmask );
- if (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS
- || sigNo == VKI_SIGFPE || sigNo == VKI_SIGILL) {
+ if (needs_to_be_delivered
+ && (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS
+ || sigNo == VKI_SIGFPE || sigNo == VKI_SIGILL)) {
/* Can't continue; must longjmp back to the scheduler and thus
enter the sighandler immediately. */
VG_(longjmpd_on_signal) = sigNo;
static
UInt run_thread_for_a_while ( ThreadId tid )
{
- UInt trc = 0;
+ volatile UInt trc = 0;
vg_assert(is_valid_tid(tid));
vg_assert(vg_threads[tid].status == VgTs_Runnable);
vg_assert(VG_(bbs_to_go) > 0);
static void VG_(oursignalhandler) ( Int sigNo )
{
+ Bool needs_to_be_delivered;
Int dummy_local;
vki_ksigset_t saved_procmask;
VG_(block_all_host_signals)( &saved_procmask );
+ needs_to_be_delivered = False;
+
if (VG_(sighandler)[sigNo] == NULL) {
if (VG_(clo_trace_signals)) {
VG_(add_to_msg)("unexpected!");
VG_(add_to_msg)("queued" );
VG_(end_msg)();
}
+ needs_to_be_delivered = True;
}
/* We've finished messing with the queue, so re-enable host
signals. */
VG_(restore_host_signals)( &saved_procmask );
- if (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS
- || sigNo == VKI_SIGFPE || sigNo == VKI_SIGILL) {
+ if (needs_to_be_delivered
+ && (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS
+ || sigNo == VKI_SIGFPE || sigNo == VKI_SIGILL)) {
/* Can't continue; must longjmp back to the scheduler and thus
enter the sighandler immediately. */
VG_(longjmpd_on_signal) = sigNo;