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 | |
| parent | 2450b55c7b80ffc81b94d1428d96288788187fcf (diff) | |
| download | plan9front-4fe344847cebf9fd9071d83c6bf7ed7a6c1da35e.tar.xz | |
kernel: better pidalloc()
| -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]; |
