void (*post_mutex_unlock) ( ThreadId tid,
void* /*pthread_mutex_t* */ mutex );
+ /* Signal events (not exhaustive) */
+ void (*pre_deliver_signal) ( ThreadId tid, Int sigNo, Bool alt_stack );
+ void (*post_deliver_signal) ( ThreadId tid, Int sigNo );
+
- /* Others... condition variable, signal events... */
+ /* Others... condition variable... */
/* ... */
}
VgTrackEvents;
VgTrackEvents VG_(track_events) = {
/* Memory events */
- .new_mem_startup = NULL,
- .new_mem_heap = NULL,
- .new_mem_stack = NULL,
- .new_mem_stack_aligned = NULL,
- .new_mem_stack_signal = NULL,
- .new_mem_brk = NULL,
- .new_mem_mmap = NULL,
-
- .copy_mem_heap = NULL,
- .copy_mem_remap = NULL,
- .change_mem_mprotect = NULL,
-
- .ban_mem_heap = NULL,
- .ban_mem_stack = NULL,
-
- .die_mem_heap = NULL,
- .die_mem_stack = NULL,
- .die_mem_stack_aligned = NULL,
- .die_mem_stack_signal = NULL,
- .die_mem_brk = NULL,
- .die_mem_munmap = NULL,
-
- .bad_free = NULL,
- .mismatched_free = NULL,
-
- .pre_mem_read = NULL,
- .pre_mem_read_asciiz = NULL,
- .pre_mem_write = NULL,
- .post_mem_write = NULL,
+ .new_mem_startup = NULL,
+ .new_mem_heap = NULL,
+ .new_mem_stack = NULL,
+ .new_mem_stack_aligned = NULL,
+ .new_mem_stack_signal = NULL,
+ .new_mem_brk = NULL,
+ .new_mem_mmap = NULL,
+
+ .copy_mem_heap = NULL,
+ .copy_mem_remap = NULL,
+ .change_mem_mprotect = NULL,
+
+ .ban_mem_heap = NULL,
+ .ban_mem_stack = NULL,
+
+ .die_mem_heap = NULL,
+ .die_mem_stack = NULL,
+ .die_mem_stack_aligned = NULL,
+ .die_mem_stack_signal = NULL,
+ .die_mem_brk = NULL,
+ .die_mem_munmap = NULL,
+
+ .bad_free = NULL,
+ .mismatched_free = NULL,
+
+ .pre_mem_read = NULL,
+ .pre_mem_read_asciiz = NULL,
+ .pre_mem_write = NULL,
+ .post_mem_write = NULL,
/* Scheduler events */
- .thread_run = NULL,
+ .thread_run = NULL,
/* Mutex events */
- .post_mutex_lock = NULL,
- .post_mutex_unlock = NULL,
+ .post_mutex_lock = NULL,
+ .post_mutex_unlock = NULL,
+
+ /* Signal events */
+ .pre_deliver_signal = NULL,
+ .post_deliver_signal = NULL,
};
/* static */
TRACK(post_mutex_lock, ThreadId tid, void* /*pthread_mutex_t* */ mutex)
TRACK(post_mutex_unlock, ThreadId tid, void* /*pthread_mutex_t* */ mutex)
+TRACK(pre_deliver_signal, ThreadId tid, Int sigNum, Bool alt_stack)
+TRACK(post_deliver_signal, ThreadId tid, Int sigNum)
+
/*--------------------------------------------------------------------*/
/* UCodeBlocks */
VG_(message)(Vg_DebugMsg,
"delivering signal %d to thread %d: on ALT STACK",
sigNo, tid );
+
+ /* Signal delivery to skins */
+ VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );
+
} else {
esp_top_of_frame = tst->m_esp;
+
+ /* Signal delivery to skins */
+ VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True );
}
esp = esp_top_of_frame;
was delivered. */
tst->status = frame->status;
+ /* Notify skins */
+ VG_TRACK( post_deliver_signal, tid, sigNo );
+
return sigNo;
}