github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/iavl/mutable_tree_map.go (about) 1 package iavl 2 3 import ( 4 "sync" 5 ) 6 7 var treeMap *TreeMap 8 9 type TreeMap struct { 10 mtx sync.RWMutex 11 // used for checking whether a tree is saved or not 12 mutableTreeSavedMap map[string]*MutableTree 13 totalPpncSize int64 14 evmPpncSize int64 15 accPpncSize int64 16 lastUpdatedVersion int64 17 } 18 19 func init() { 20 treeMap = &TreeMap{ 21 mutableTreeSavedMap: make(map[string]*MutableTree), 22 } 23 } 24 25 func (tm *TreeMap) addNewTree(tree *MutableTree) { 26 tm.mtx.Lock() 27 defer tm.mtx.Unlock() 28 if _, ok := tm.mutableTreeSavedMap[tree.GetModuleName()]; !ok { 29 tm.mutableTreeSavedMap[tree.GetModuleName()] = tree 30 go tree.commitSchedule() 31 if EnablePruningHistoryState { 32 go tree.pruningSchedule() 33 } 34 } 35 } 36 37 func (tm *TreeMap) getTree(moduleName string) (tree *MutableTree, ok bool) { 38 tm.mtx.RLock() 39 defer tm.mtx.RUnlock() 40 tree, ok = tm.mutableTreeSavedMap[moduleName] 41 return 42 } 43 44 // updateMutableTreeMap marks into true when operation of save-version is done 45 func (tm *TreeMap) updatePpnc(version int64) { 46 tm.mtx.Lock() 47 defer tm.mtx.Unlock() 48 49 if version == tm.lastUpdatedVersion { 50 return 51 } 52 var size int64 = 0 53 for _, tree := range tm.mutableTreeSavedMap { 54 ppnc := int64(len(tree.ndb.prePersistNodeCache)) 55 size += ppnc 56 if tree.GetModuleName() == "evm" { 57 tm.evmPpncSize = ppnc 58 } 59 if tree.GetModuleName() == "acc" { 60 tm.accPpncSize = ppnc 61 } 62 } 63 tm.totalPpncSize = size 64 tm.lastUpdatedVersion = version 65 } 66 67 // resetMap clear the TreeMap, only for test. 68 func (tm *TreeMap) resetMap() { 69 tm.mtx.Lock() 70 defer tm.mtx.Unlock() 71 tm.mutableTreeSavedMap = make(map[string]*MutableTree) 72 }