diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-12-21 23:08:15 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-12-21 23:08:15 +0100 |
commit | 4fe344847cebf9fd9071d83c6bf7ed7a6c1da35e (patch) | |
tree | 29cc4bca57f2ce3505ebfdb12d72655f37e7bf8f /sys/src/9/port/proc.c | |
parent | 2450b55c7b80ffc81b94d1428d96288788187fcf (diff) |
kernel: better pidalloc()
Diffstat (limited to 'sys/src/9/port/proc.c')
-rw-r--r-- | sys/src/9/port/proc.c | 15 |
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]; |