|
@@ -298,6 +298,7 @@ void do_schedule_next_timer(struct siginfo *info)
|
|
|
|
|
|
int posix_timer_event(struct k_itimer *timr, int si_private)
|
|
|
{
|
|
|
+ int shared, ret;
|
|
|
/*
|
|
|
* FIXME: if ->sigq is queued we can race with
|
|
|
* dequeue_signal()->do_schedule_next_timer().
|
|
@@ -316,20 +317,10 @@ int posix_timer_event(struct k_itimer *timr, int si_private)
|
|
|
timr->sigq->info.si_tid = timr->it_id;
|
|
|
timr->sigq->info.si_value = timr->it_sigev_value;
|
|
|
|
|
|
- if (timr->it_sigev_notify & SIGEV_THREAD_ID) {
|
|
|
- struct task_struct *leader;
|
|
|
- int ret = send_sigqueue(timr->sigq, timr->it_process, 0);
|
|
|
-
|
|
|
- if (likely(ret >= 0))
|
|
|
- return ret;
|
|
|
-
|
|
|
- timr->it_sigev_notify = SIGEV_SIGNAL;
|
|
|
- leader = timr->it_process->group_leader;
|
|
|
- put_task_struct(timr->it_process);
|
|
|
- timr->it_process = leader;
|
|
|
- }
|
|
|
-
|
|
|
- return send_sigqueue(timr->sigq, timr->it_process, 1);
|
|
|
+ shared = !(timr->it_sigev_notify & SIGEV_THREAD_ID);
|
|
|
+ ret = send_sigqueue(timr->sigq, timr->it_process, shared);
|
|
|
+ /* If we failed to send the signal the timer stops. */
|
|
|
+ return ret > 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(posix_timer_event);
|
|
|
|