summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/rregexec.c
diff options
context:
space:
mode:
authorben <ben@cirno>2016-04-27 17:36:43 -0500
committerben <ben@cirno>2016-04-27 17:36:43 -0500
commit3bf6ef0196645fabb0d45c92462753c4554c9fd8 (patch)
tree6b8769f9cd0bd5d55f1661287aaa6a1ca39a9528 /sys/src/libregexp/rregexec.c
parent86e0099835f99de6ccc3bee33a297387993aa037 (diff)
better memory management of threads (thanks knuth)
Diffstat (limited to 'sys/src/libregexp/rregexec.c')
-rw-r--r--sys/src/libregexp/rregexec.c53
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 */