mirror of https://github.com/golang/go.git
regexp: use sync.Pool
For machines, not threads. Update #4720 R=golang-dev, rsc CC=golang-dev https://golang.org/cl/44150043
This commit is contained in:
parent
4890502af6
commit
b682f6de5a
|
|
@ -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
|
||||
if v := re.machinePool.Get(); v != nil {
|
||||
return v.(*machine)
|
||||
}
|
||||
re.mu.Unlock()
|
||||
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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue