summaryrefslogtreecommitdiff
path: root/sys/src/9/port/proc.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-12-21 23:08:15 +0100
committercinap_lenrek <cinap_lenrek@centraldogma>2011-12-21 23:08:15 +0100
commit4fe344847cebf9fd9071d83c6bf7ed7a6c1da35e (patch)
tree29cc4bca57f2ce3505ebfdb12d72655f37e7bf8f /sys/src/9/port/proc.c
parent2450b55c7b80ffc81b94d1428d96288788187fcf (diff)
kernel: better pidalloc()
Diffstat (limited to 'sys/src/9/port/proc.c')
-rw-r--r--sys/src/9/port/proc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c
index dd8862baa..6bb60d6b5 100644
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -1592,19 +1592,22 @@ accounttime(void)
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];