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  }