Skip to content

Commit

Permalink
fix: reverse should reverse in place + data race on copy (#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
glouvigny committed Jun 15, 2021
1 parent 9b80112 commit a2513d5
Showing 1 changed file with 16 additions and 29 deletions.
45 changes: 16 additions & 29 deletions entry/entry_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,36 @@ type OrderedMap struct {
lock sync.RWMutex
keys []string
values map[string]iface.IPFSLogEntry
copied bool
}

func (o *OrderedMap) Copy() iface.IPFSLogOrderedEntries {
o.lock.RLock()
defer o.lock.RUnlock()

values := map[string]iface.IPFSLogEntry{}
for k, v := range o.values {
values[k] = v
}

keys := make([]string, len(o.keys))
copy(keys, o.keys)

return &OrderedMap{
keys: o.keys,
values: o.values,
copied: true,
keys: keys,
values: values,
}
}

func (o *OrderedMap) Reverse() iface.IPFSLogOrderedEntries {
o.lock.RLock()
defer o.lock.RUnlock()
o.lock.Lock()
defer o.lock.Unlock()

keys := o.keys
for i := len(keys)/2 - 1; i >= 0; i-- {
opp := len(keys) - 1 - i
keys[i], keys[opp] = keys[opp], keys[i]
for i := len(o.keys)/2 - 1; i >= 0; i-- {
opp := len(o.keys) - 1 - i
o.keys[i], o.keys[opp] = o.keys[opp], o.keys[i]
}

return &OrderedMap{
keys: o.keys,
values: o.values,
copied: true,
}
return o
}

// NewOrderedMap creates a new OrderedMap of entries.
Expand Down Expand Up @@ -101,25 +102,11 @@ func (o *OrderedMap) UnsafeGet(key string) iface.IPFSLogEntry {
return val
}

func (o *OrderedMap) preWrite() {
if o.copied {
o.copied = false
values := map[string]iface.IPFSLogEntry{}
for k, v := range o.values {
values[k] = v
}

o.values = values
}
}

// Set defines an Entry in the map for a given key.
func (o *OrderedMap) Set(key string, value iface.IPFSLogEntry) {
o.lock.Lock()
defer o.lock.Unlock()

o.preWrite()

_, exists := o.values[key]
if !exists {
o.keys = append(o.keys, key)
Expand Down

0 comments on commit a2513d5

Please sign in to comment.