if (unlikely(timr->it_process->flags & PF_EXITING)) { timr->it_sigev_notify = SIGEV_SIGNAL; put_task_struct(timr->it_process); timr->it_process = timr->it_process->group_leader; goto group; } return send_sigqueue(timr->it_sigev_signo, timr->sigq, timr->it_process); 
struct task_struct *leader; int ret = send_sigqueue(timr->it_sigev_signo, timr->sigq, timr->it_process);  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; 
int posix_timer_event(struct k_itimer *timr,int si_private){	memset(&timr->sigq->info, 0, sizeof(siginfo_t));	timr->sigq->info.si_sys_private = si_private;	/*	 * Send signal to the process that owns this timer.	 * This code assumes that all the possible abs_lists share the	 * same lock (there is only one list at this time). If this is	 * not the case, the CLOCK info would need to be used to find	 * the proper abs list lock.	 */	timr->sigq->info.si_signo = timr->it_sigev_signo;	timr->sigq->info.si_errno = 0;	timr->sigq->info.si_code = SI_TIMER;	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) {		if (unlikely(timr->it_process->flags & PF_EXITING)) {			timr->it_sigev_notify = SIGEV_SIGNAL;			put_task_struct(timr->it_process);			timr->it_process = timr->it_process->group_leader;			goto group;		}		return send_sigqueue(timr->it_sigev_signo, timr->sigq,			timr->it_process);	}	else {	group:		return send_group_sigqueue(timr->it_sigev_signo, timr->sigq,			timr->it_process);	}}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/e752dd6cc66a3e6a11396928998baf390cc00420/posix-timers.c/buggy/kernel/posix-timers.c