From b682f6de5a9d645a92792e2ffad1956c64b7840f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 18 Dec 2013 16:43:19 -0800 Subject: [PATCH] regexp: use sync.Pool For machines, not threads. Update #4720 R=golang-dev, rsc CC=golang-dev https://golang.org/cl/44150043 --- src/pkg/regexp/regexp.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/pkg/regexp/regexp.go b/src/pkg/regexp/regexp.go index 0046026eae..18fd049fc8 100644 --- a/src/pkg/regexp/regexp.go +++ b/src/pkg/regexp/regexp.go @@ -85,9 +85,8 @@ type Regexp struct { subexpNames []string longest bool - // cache of machines for running regexp - mu sync.Mutex - machine []*machine + // pool of machines for running regexp + machinePool sync.Pool // of *machine } // String returns the source text used to compile the regular expression. @@ -175,14 +174,9 @@ func compile(expr string, mode syntax.Flags, longest bool) (*Regexp, error) { // It uses the re's machine cache if possible, to avoid // unnecessary allocation. func (re *Regexp) get() *machine { - re.mu.Lock() - if n := len(re.machine); n > 0 { - z := re.machine[n-1] - re.machine = re.machine[:n-1] - re.mu.Unlock() - return z - } - re.mu.Unlock() + if v := re.machinePool.Get(); v != nil { + return v.(*machine) + } z := progMachine(re.prog) z.re = re return z @@ -193,9 +187,7 @@ func (re *Regexp) get() *machine { // grow to the maximum number of simultaneous matches // run using re. (The cache empties when re gets garbage collected.) func (re *Regexp) put(z *machine) { - re.mu.Lock() - re.machine = append(re.machine, z) - re.mu.Unlock() + re.machinePool.Put(z) } // MustCompile is like Compile but panics if the expression cannot be parsed. -- 2.48.1