From: Dmitry V. Levin Date: Fri, 23 Mar 2018 00:20:33 +0000 (+0000) Subject: strace: further optimize unblocking of the delay signal handler X-Git-Tag: v4.22~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c0896d9d80df3b725f28fc1f1b5348c5f4a70a6;p=strace strace: further optimize unblocking of the delay signal handler Do not unblock the delay signal handler unless the delay timer is armed. * defs.h (is_delay_timer_created): Remove. (is_delay_timer_armed, delay_timer_expired): New prototypes. * delay.c (delay_timer_is_armed): New static variable. (is_delay_timer_created): Add static qualifier. (is_delay_timer_armed, delay_timer_expired): New functions. (arm_delay_timer): Set delay_timer_is_armed. * strace.c (next_event): Use is_delay_timer_armed instead of is_delay_timer_created to check whether the delay signal handler has to be unblocked. (timer_sighandler): Invoke delay_timer_expired. --- diff --git a/defs.h b/defs.h index ef135528..3899dd3d 100644 --- a/defs.h +++ b/defs.h @@ -1026,7 +1026,8 @@ extern struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES]; uint16_t alloc_delay_data(void); void fill_delay_data(uint16_t delay_idx, int intval, bool isenter); -bool is_delay_timer_created(void); +bool is_delay_timer_armed(void); +void delay_timer_expired(void); void arm_delay_timer(const struct tcb *); void delay_tcb(struct tcb *, uint16_t delay_idx, bool isenter); diff --git a/delay.c b/delay.c index 8adf4cc5..86dd828e 100644 --- a/delay.c +++ b/delay.c @@ -37,6 +37,7 @@ static size_t delay_data_vec_capacity; /* size of the arena */ static size_t delay_data_vec_size; /* size of the used arena */ static timer_t delay_timer = (timer_t) -1; +static bool delay_timer_is_armed; static void expand_delay_data_vec(void) @@ -80,12 +81,24 @@ fill_delay_data(uint16_t delay_idx, int intval, bool isenter) ts->tv_nsec = intval % 1000000 * 1000; } -bool +static bool is_delay_timer_created(void) { return delay_timer != (timer_t) -1; } +bool +is_delay_timer_armed(void) +{ + return delay_timer_is_armed; +} + +void +delay_timer_expired(void) +{ + delay_timer_is_armed = false; +} + void arm_delay_timer(const struct tcb *const tcp) { @@ -96,6 +109,8 @@ arm_delay_timer(const struct tcb *const tcp) if (timer_settime(delay_timer, TIMER_ABSTIME, &its, NULL)) perror_msg_and_die("timer_settime"); + delay_timer_is_armed = true; + debug_func_msg("timer set to %lld.%09ld for pid %d", (long long) tcp->delay_expiration_time.tv_sec, (long) tcp->delay_expiration_time.tv_nsec, diff --git a/strace.c b/strace.c index 16b1a864..1493e9d9 100644 --- a/strace.c +++ b/strace.c @@ -2236,7 +2236,7 @@ next_event(int *pstatus, siginfo_t *si) return TE_BREAK; } - const bool unblock_delay_timer = is_delay_timer_created(); + const bool unblock_delay_timer = is_delay_timer_armed(); /* * The window of opportunity to handle expirations @@ -2607,6 +2607,8 @@ restart_delayed_tcbs(void) static void timer_sighandler(int sig) { + delay_timer_expired(); + if (restart_failed) return;