From 946d2a96f23a7ab2d96f1ec8d77f72dd7457f7cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 14 Dec 2014 03:16:10 +0000 Subject: [PATCH] add locks to wantlist to avoid race condition --- exchange/bitswap/wantlist/wantlist.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/exchange/bitswap/wantlist/wantlist.go b/exchange/bitswap/wantlist/wantlist.go index d57b9d523..0de0ba803 100644 --- a/exchange/bitswap/wantlist/wantlist.go +++ b/exchange/bitswap/wantlist/wantlist.go @@ -3,9 +3,11 @@ package wantlist import ( u "github.com/jbenet/go-ipfs/util" "sort" + "sync" ) type Wantlist struct { + lk sync.RWMutex set map[u.Key]*Entry } @@ -21,6 +23,8 @@ type Entry struct { } func (w *Wantlist) Add(k u.Key, priority int) { + w.lk.Lock() + defer w.lk.Unlock() if _, ok := w.set[k]; ok { return } @@ -31,10 +35,14 @@ func (w *Wantlist) Add(k u.Key, priority int) { } func (w *Wantlist) Remove(k u.Key) { + w.lk.Lock() + defer w.lk.Unlock() delete(w.set, k) } func (w *Wantlist) Contains(k u.Key) bool { + w.lk.RLock() + defer w.lk.RUnlock() _, ok := w.set[k] return ok } @@ -46,6 +54,8 @@ func (es entrySlice) Swap(i, j int) { es[i], es[j] = es[j], es[i] } func (es entrySlice) Less(i, j int) bool { return es[i].Priority > es[j].Priority } func (w *Wantlist) Entries() []*Entry { + w.lk.RLock() + defer w.lk.RUnlock() var es entrySlice for _, e := range w.set {