kernel: better pidalloc()

This commit is contained in:
cinap_lenrek 2011-12-21 23:08:15 +01:00
parent 2450b55c7b
commit 4fe344847c

View file

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