/* * While we have tasklist_lock read-locked, no dying thread * can be updating current->signal->[us]time.  Instead, * we got their counts included in the live thread loop. * However, another thread can come in right now and * do a wait call that updates current->signal->c[us]time. * To make sure we always see that pair updated atomically, * we take the siglock around fetching them. */ spin_lock_irq(&tsk->sighand->siglock); cutime = tsk->signal->cutime; cstime = tsk->signal->cstime; spin_unlock_irq(&tsk->sighand->siglock); read_unlock(&tasklist_lock); 
/* Process with multiple threads */ struct task_struct *tsk = current; struct task_struct *t; 
asmlinkage long sys_times(struct tms __user * tbuf){	/*	 *	In the SMP world we might just be unlucky and have one of	 *	the times increment as we use it. Since the value is an	 *	atomically safe type this is just fine. Conceptually its	 *	as if the syscall took an instant longer to occur.	 */	if (tbuf) {		struct tms tmp;		struct task_struct *tsk = current;		struct task_struct *t;		cputime_t utime, stime, cutime, cstime;		read_lock(&tasklist_lock);		utime = tsk->signal->utime;		stime = tsk->signal->stime;		t = tsk;		do {			utime = cputime_add(utime, t->utime);			stime = cputime_add(stime, t->stime);			t = next_thread(t);		} while (t != tsk);		/*		 * While we have tasklist_lock read-locked, no dying thread		 * can be updating current->signal->[us]time.  Instead,		 * we got their counts included in the live thread loop.		 * However, another thread can come in right now and		 * do a wait call that updates current->signal->c[us]time.		 * To make sure we always see that pair updated atomically,		 * we take the siglock around fetching them.		 */		spin_lock_irq(&tsk->sighand->siglock);		cutime = tsk->signal->cutime;		cstime = tsk->signal->cstime;		spin_unlock_irq(&tsk->sighand->siglock);		read_unlock(&tasklist_lock);		tmp.tms_utime = cputime_to_clock_t(utime);		tmp.tms_stime = cputime_to_clock_t(stime);		tmp.tms_cutime = cputime_to_clock_t(cutime);		tmp.tms_cstime = cputime_to_clock_t(cstime);		if (copy_to_user(tbuf, &tmp, sizeof(struct tms)))			return -EFAULT;	}	return (long) jiffies_64_to_clock_t(get_jiffies_64());}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/71a2224d7d1cefc23a1ac80bba421cc069cc3257/sys.c/clean/kernel/sys.c