|
@@ -464,8 +464,12 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid)
|
|
|
static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
|
|
|
ktime_t now)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
struct k_itimer *ptr = container_of(alarm, struct k_itimer,
|
|
|
it.alarm.alarmtimer);
|
|
|
+ enum alarmtimer_restart result = ALARMTIMER_NORESTART;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&ptr->it_lock, flags);
|
|
|
if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) {
|
|
|
if (posix_timer_event(ptr, 0) != 0)
|
|
|
ptr->it_overrun++;
|
|
@@ -475,9 +479,11 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
|
|
|
if (ptr->it.alarm.interval.tv64) {
|
|
|
ptr->it_overrun += alarm_forward(alarm, now,
|
|
|
ptr->it.alarm.interval);
|
|
|
- return ALARMTIMER_RESTART;
|
|
|
+ result = ALARMTIMER_RESTART;
|
|
|
}
|
|
|
- return ALARMTIMER_NORESTART;
|
|
|
+ spin_unlock_irqrestore(&ptr->it_lock, flags);
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|