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);
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)
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)
{
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,
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
static void
timer_sighandler(int sig)
{
+ delay_timer_expired();
+
if (restart_failed)
return;