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.
// 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
// 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.