From: Brad Fitzpatrick Date: Thu, 19 Dec 2013 00:43:19 +0000 (-0800) Subject: regexp: use sync.Pool X-Git-Tag: go1.3beta1~1149 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b682f6de5a9d645a92792e2ffad1956c64b7840f;p=gostls13.git regexp: use sync.Pool For machines, not threads. Update #4720 R=golang-dev, rsc CC=golang-dev https://golang.org/cl/44150043 --- 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.