Module Name:    src
Committed By:   christos
Date:           Fri Oct 21 02:08:10 UTC 2011

Modified Files:
        src/sys/kern: tty.c

Log Message:
extract broken proc_compare. lwp compares against self.


To generate a diff of this commit:
cvs rdiff -u -r1.248 -r1.249 src/sys/kern/tty.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/tty.c
diff -u src/sys/kern/tty.c:1.248 src/sys/kern/tty.c:1.249
--- src/sys/kern/tty.c:1.248	Fri Sep 23 20:05:38 2011
+++ src/sys/kern/tty.c	Thu Oct 20 22:08:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.c,v 1.248 2011/09/24 00:05:38 christos Exp $	*/
+/*	$NetBSD: tty.c,v 1.249 2011/10/21 02:08:09 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.248 2011/09/24 00:05:38 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.249 2011/10/21 02:08:09 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -99,7 +99,7 @@ static void	ttyecho(int, struct tty *);
 static void	ttyrubo(struct tty *, int);
 static void	ttyprintf_nolock(struct tty *, const char *fmt, ...)
     __attribute__((__format__(__printf__,2,3)));
-static int	proc_compare(struct proc *, struct proc *);
+static int	proc_compare_wrapper(struct proc *, struct proc *);
 static void	ttysigintr(void *);
 
 /* Symbolic sleep message strings. */
@@ -2488,7 +2488,7 @@ ttygetinfo(struct tty *tp, int fromsig, 
 			} else
 				mutex_enter(p->p_lock);
 			oldpick = pick;
-			if (proc_compare(pick, p))
+			if (proc_compare_wrapper(pick, p))
 				pick = p;
 			mutex_exit(p->p_lock);
 			if (p->p_lock != oldpick->p_lock)
@@ -2594,26 +2594,11 @@ ttyputinfo(struct tty *tp, char *buf)
 }
 
 /*
- * Returns 1 if p2 is "better" than p1
- *
- * The algorithm for picking the "interesting" process is thus:
- *
- *	1) Only foreground processes are eligible - implied.
- *	2) Runnable processes are favored over anything else.  The runner
- *	   with the highest CPU utilization is picked (l_pctcpu).  Ties are
- *	   broken by picking the highest pid.
- *	3) The sleeper with the shortest sleep time is next.  With ties,
- *	   we pick out just "short-term" sleepers (P_SINTR == 0).
- *	4) Further ties are broken by picking the highest pid.
- */
-#define	ISRUN(p)	((p)->p_nrlwps > 0)
-#define	TESTAB(a, b)	((a)<<1 | (b))
-#define	ONLYA	2
-#define	ONLYB	1
-#define	BOTH	3
-
+ * Returns 1 if p2 has a better chance being the active foreground process
+ * in a terminal instead of p1.
+ */
 static int
-proc_compare(struct proc *p1, struct proc *p2)
+proc_compare_wrapper(struct proc *p1, struct proc *p2)
 {
 	lwp_t *l1, *l2;
 
@@ -2621,51 +2606,12 @@ proc_compare(struct proc *p1, struct pro
 	KASSERT(mutex_owned(p2->p_lock));
 
 	if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL)
-		return (1);
+		return 1;
+
 	if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL)
-		return (0);
-	/*
-	 * see if at least one of them is runnable
-	 */
-	switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
-	case ONLYA:
-		return (0);
-	case ONLYB:
-		return (1);
-	case BOTH:
-		/*
-		 * tie - favor one with highest recent CPU utilization
-		 */
-		if (l2->l_pctcpu > l1->l_pctcpu)
-			return (1);
-		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
-	}
-	/*
- 	 * weed out zombies
-	 */
-	switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
-	case ONLYA:
-		return (1);
-	case ONLYB:
-		return (0);
-	case BOTH:
-		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
-	}
-	/*
-	 * pick the one with the smallest sleep time
-	 */
-	if (l2->l_slptime > l2->l_slptime)
-		return (0);
-	if (l2->l_slptime > l2->l_slptime)
-		return (1);
-	/*
-	 * favor one sleeping in a non-interruptible sleep
-	 */
-	if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
-		return (1);
-	if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
-		return (0);
-	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
+		return 0;
+
+	return proc_compare(p1, l1, p2, l2);
 }
 
 /*

Reply via email to