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];
--
⑨