github.com/okex/exchain@v1.8.0/libs/tendermint/state/execution_datamap.go (about) 1 package state 2 3 import ( 4 "container/list" 5 "sync" 6 ) 7 8 type deltaMap struct { 9 mtx sync.Mutex 10 cacheMap map[int64]*list.Element 11 cacheList *list.List 12 mrh int64 13 } 14 15 func newDataMap() *deltaMap { 16 return &deltaMap{ 17 cacheMap: make(map[int64]*list.Element), 18 cacheList: list.New(), 19 } 20 } 21 22 type payload struct { 23 h int64 24 di *DeltaInfo 25 } 26 27 func (m *deltaMap) insert(height int64, deltaInfo *DeltaInfo, mrh int64) { 28 if deltaInfo == nil { 29 return 30 } 31 32 m.mtx.Lock() 33 defer m.mtx.Unlock() 34 e := m.cacheList.PushBack(&payload{height, deltaInfo}) 35 m.cacheMap[height] = e 36 m.mrh = mrh 37 } 38 39 func (m *deltaMap) fetch(height int64) (*DeltaInfo, int64) { 40 m.mtx.Lock() 41 defer m.mtx.Unlock() 42 43 popped := m.cacheMap[height] 44 delete(m.cacheMap, height) 45 if popped != nil { 46 m.cacheList.Remove(popped) 47 pl := popped.Value.(*payload) 48 return pl.di, m.mrh 49 } 50 51 return nil, m.mrh 52 } 53 54 // remove all elements no higher than target 55 func (m *deltaMap) remove(target int64) (int, int) { 56 m.mtx.Lock() 57 defer m.mtx.Unlock() 58 59 num := 0 60 for { 61 e := m.cacheList.Front() 62 if e == nil { 63 break 64 } 65 h := e.Value.(*payload).h 66 if h > target { 67 break 68 } 69 m.cacheList.Remove(e) 70 delete(m.cacheMap, h) 71 num++ 72 } 73 74 return num, len(m.cacheMap) 75 } 76 77 func (m *deltaMap) info() (int, int) { 78 m.mtx.Lock() 79 defer m.mtx.Unlock() 80 return len(m.cacheMap), m.cacheList.Len() 81 }