summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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];