diff options
author | ben <ben@cirno> | 2016-04-27 17:36:43 -0500 |
---|---|---|
committer | ben <ben@cirno> | 2016-04-27 17:36:43 -0500 |
commit | 3bf6ef0196645fabb0d45c92462753c4554c9fd8 (patch) | |
tree | 6b8769f9cd0bd5d55f1661287aaa6a1ca39a9528 /sys/src/libregexp/rregexec.c | |
parent | 86e0099835f99de6ccc3bee33a297387993aa037 (diff) |
better memory management of threads (thanks knuth)
Diffstat (limited to 'sys/src/libregexp/rregexec.c')
-rw-r--r-- | sys/src/libregexp/rregexec.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/sys/src/libregexp/rregexec.c b/sys/src/libregexp/rregexec.c index 572718733..557580b9c 100644 --- a/sys/src/libregexp/rregexec.c +++ b/sys/src/libregexp/rregexec.c @@ -14,10 +14,10 @@ int rregexec(Reprog *prog, Rune *str, Resub *sem, int msize) { RethreadQ lists[2], *clist, *nlist, *tmp; - Rethread *t, *nextthr, **availthr; + Rethread *t, *next, *pooltop, *avail; Reinst *curinst; Rune *rsp, *rep, endr, last; - int i, match, first, gen, pri, matchpri; + int match, first, gen, pri, matchpri; if(msize > NSUBEXPM) msize = NSUBEXPM; @@ -34,9 +34,8 @@ rregexec(Reprog *prog, Rune *str, Resub *sem, int msize) nlist->head = nil; nlist->tail = &nlist->head; - for(i = 0; i < prog->nthr; i++) - prog->thrpool[i] = prog->threads + i; - availthr = prog->thrpool + prog->nthr; + pooltop = prog->threads + prog->nthr; + avail = nil; pri = matchpri = gen = match = 0; rsp = str; @@ -70,14 +69,14 @@ Again: goto Done; case OANY: /* fallthrough */ Any: - nextthr = t->next; + next = t->next; t->pc = curinst + 1; t->next = nil; *nlist->tail = t; nlist->tail = &t->next; - if(nextthr == nil) + if(next == nil) break; - t = nextthr; + t = next; curinst = t->pc; goto Again; case OCLASS: @@ -88,14 +87,14 @@ Again: curinst++; goto Class; } - nextthr = t->next; + next = t->next; t->pc = curinst->a; t->next = nil; *nlist->tail = t; nlist->tail = &t->next; - if(nextthr == nil) + if(next == nil) break; - t = nextthr; + t = next; curinst = t->pc; goto Again; case ONOTNL: @@ -122,13 +121,18 @@ Again: curinst = curinst->a; goto Again; case OSPLIT: - nextthr = *--availthr; - nextthr->pc = curinst->b; + if(avail == nil) + next = --pooltop; + else { + next = avail; + avail = avail->next; + } + next->pc = curinst->b; if(msize > 0) - memcpy(nextthr->sem, t->sem, sizeof(Resub)*msize); - nextthr->pri = t->pri; - nextthr->next = t->next; - t->next = nextthr; + memcpy(next->sem, t->sem, sizeof(Resub)*msize); + next->pri = t->pri; + next->next = t->next; + t->next = next; curinst = curinst->a; goto Again; case OSAVE: @@ -154,10 +158,12 @@ Again: curinst++; goto Again; Done: - *availthr++ = t; - t = t->next; - if(t == nil) + next = t->next; + t->next = avail; + avail = t; + if(next == nil) break; + t = next; curinst = t->pc; goto Again; } @@ -165,7 +171,12 @@ Start: /* Start again once if we haven't found anything. */ if(first == 1 && match == 0) { first = 0; - t = *--availthr; + if(avail == nil) + t = --pooltop; + else { + t = avail; + avail = avail->next; + } if(msize > 0) memset(t->sem, 0, sizeof(Resub)*msize); /* "Lower" priority thread */ |