vki_sigset_t* set,
vki_sigset_t* oldset );
-/* Handy utilities to block/restore all host signals. */
-extern void VG_(block_all_host_signals)
- ( /* OUT */ vki_sigset_t* saved_mask );
-extern void VG_(restore_all_host_signals)
- ( /* IN */ vki_sigset_t* saved_mask );
+extern void VG_(clear_out_queued_signals)
+ ( ThreadId tid, /* OUT */ vki_sigset_t* saved_mask );
extern void VG_(kill_self)(Int sigNo);
VG_(threads)[tid].altstack.ss_size = 0;
VG_(threads)[tid].altstack.ss_flags = VKI_SS_DISABLE;
- /* clear out queued signals */
- VG_(block_all_host_signals)(&savedmask);
- if (VG_(threads)[tid].sig_queue != NULL) {
- VG_(arena_free)(VG_AR_CORE, VG_(threads)[tid].sig_queue);
- VG_(threads)[tid].sig_queue = NULL;
- }
- VG_(restore_all_host_signals)(&savedmask);
+ VG_(clear_out_queued_signals)(tid, &savedmask);
VG_(threads)[tid].sched_jmpbuf_valid = False;
}
------------------------------------------------------------------ */
/* Block all host signals, dumping the old mask in *saved_mask. */
-void VG_(block_all_host_signals) ( /* OUT */ vki_sigset_t* saved_mask )
+static void block_all_host_signals ( /* OUT */ vki_sigset_t* saved_mask )
{
Int ret;
vki_sigset_t block_procmask;
}
/* Restore the blocking mask using the supplied saved one. */
-void VG_(restore_all_host_signals) ( /* IN */ vki_sigset_t* saved_mask )
+static void restore_all_host_signals ( /* IN */ vki_sigset_t* saved_mask )
{
Int ret;
ret = VG_(sigprocmask)(VKI_SIG_SETMASK, saved_mask, NULL);
vg_assert(ret == 0);
}
+void VG_(clear_out_queued_signals)( ThreadId tid, vki_sigset_t* saved_mask )
+{
+ block_all_host_signals(saved_mask);
+ if (VG_(threads)[tid].sig_queue != NULL) {
+ VG_(arena_free)(VG_AR_CORE, VG_(threads)[tid].sig_queue);
+ VG_(threads)[tid].sig_queue = NULL;
+ }
+ restore_all_host_signals(saved_mask);
+}
+
Bool VG_(client_signal_OK)(Int sigNo)
{
/* signal 0 is OK for kill */
tst = VG_(get_ThreadState)(tid);
/* Protect the signal queue against async deliveries */
- VG_(block_all_host_signals)(&savedmask);
+ block_all_host_signals(&savedmask);
if (tst->sig_queue == NULL) {
tst->sig_queue = VG_(arena_malloc)(VG_AR_CORE, sizeof(*tst->sig_queue));
sq->sigs[sq->next] = *si;
sq->next = (sq->next+1) % N_QUEUED_SIGNALS;
- VG_(restore_all_host_signals)(&savedmask);
+ restore_all_host_signals(&savedmask);
}
/*
//VG_(printf)("tid %d pollset=%08x%08x\n", tid, pollset.sig[1], pollset.sig[0]);
- VG_(block_all_host_signals)(&saved_mask); // protect signal queue
+ block_all_host_signals(&saved_mask); // protect signal queue
/* First look for any queued pending signals */
sip = next_queued(tid, &pollset); /* this thread */
where it came from */
}
- VG_(restore_all_host_signals)(&saved_mask);
+ restore_all_host_signals(&saved_mask);
}
/* At startup, copy the process' real signal state to the SCSS.
/* Block all signals. saved_procmask remembers the previous mask,
which the first thread inherits.
*/
- VG_(block_all_host_signals)( &saved_procmask );
+ block_all_host_signals( &saved_procmask );
/* Copy per-signal settings to SCSS. */
for (i = 1; i <= _VKI_NSIG; i++) {