git: 9front

Download patch

ref: f2ba4fb36684ecdd3e1989b1934ac332e3a7bda4
parent: e9cedfb90ba2324ea5f3dd69fa71a69871f0c19c
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Wed Dec 21 18:08:15 EST 2011

kernel: better pidalloc()

--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -1592,19 +1592,22 @@
 int
 pidalloc(Proc *p)
 {
-	static Ref ref;
+	static int gen, wrapped;
 	int pid, h;
 	Proc *x;
 
 	lock(&procalloc);
 Retry:
-	pid = incref(&ref) & 0x7FFFFFFF;
-	if(pid == 0)
+	pid = ++gen & 0x7FFFFFFF;
+	if(pid == 0){
+		wrapped = 1;
 		goto Retry;
+	}
 	h = pid % nelem(procalloc.ht);
-	for(x = procalloc.ht[h]; x != nil; x = x->pidhash)
-		if(x->pid == pid)
-			goto Retry;
+	if(wrapped)
+		for(x = procalloc.ht[h]; x != nil; x = x->pidhash)
+			if(x->pid == pid)
+				goto Retry;
 	if(p){
 		p->pid = pid;
 		p->pidhash = procalloc.ht[h];
--