aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/corpus/prio.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-05-13 16:42:19 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-05-13 15:11:49 +0000
commitc97f7904756c14a6f9a3d3db62881c9eadd0f6c2 (patch)
tree4196da995db053bdac7af4189916de54c209b6a9 /pkg/corpus/prio.go
parent4a623fface69b3124c66c6b0859ab1fc08b47e47 (diff)
pkg/corpus: don't overwrite ProgsList
There's still a risk of a race between the pointer overwriting and accesses to the embedded object. Let's use an internal replace() method instead.
Diffstat (limited to 'pkg/corpus/prio.go')
-rw-r--r--pkg/corpus/prio.go32
1 files changed, 20 insertions, 12 deletions
diff --git a/pkg/corpus/prio.go b/pkg/corpus/prio.go
index a4d85a518..57f9ddaf5 100644
--- a/pkg/corpus/prio.go
+++ b/pkg/corpus/prio.go
@@ -19,18 +19,6 @@ type ProgramsList struct {
accPrios []int64
}
-func (pl *ProgramsList) saveProgram(p *prog.Prog, signal signal.Signal) {
- pl.mu.Lock()
- defer pl.mu.Unlock()
- prio := int64(len(signal))
- if prio == 0 {
- prio = 1
- }
- pl.sumPrios += prio
- pl.accPrios = append(pl.accPrios, pl.sumPrios)
- pl.progs = append(pl.progs, p)
-}
-
func (pl *ProgramsList) ChooseProgram(r *rand.Rand) *prog.Prog {
pl.mu.RLock()
defer pl.mu.RUnlock()
@@ -49,3 +37,23 @@ func (pl *ProgramsList) Programs() []*prog.Prog {
defer pl.mu.RUnlock()
return pl.progs
}
+
+func (pl *ProgramsList) saveProgram(p *prog.Prog, signal signal.Signal) {
+ pl.mu.Lock()
+ defer pl.mu.Unlock()
+ prio := int64(len(signal))
+ if prio == 0 {
+ prio = 1
+ }
+ pl.sumPrios += prio
+ pl.accPrios = append(pl.accPrios, pl.sumPrios)
+ pl.progs = append(pl.progs, p)
+}
+
+func (pl *ProgramsList) replace(other *ProgramsList) {
+ pl.mu.Lock()
+ defer pl.mu.Unlock()
+ pl.sumPrios = other.sumPrios
+ pl.accPrios = other.accPrios
+ pl.progs = other.progs
+}