40 lines
843 B
Go
40 lines
843 B
Go
|
package state
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
)
|
||
|
|
||
|
// sharedPool is used to store maps of originStorage of stateObjects
|
||
|
type StoragePool struct {
|
||
|
sync.RWMutex
|
||
|
sharedMap map[common.Address]*sync.Map
|
||
|
}
|
||
|
|
||
|
func NewStoragePool() *StoragePool {
|
||
|
sharedMap := make(map[common.Address]*sync.Map)
|
||
|
return &StoragePool{
|
||
|
sync.RWMutex{},
|
||
|
sharedMap,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// getStorage Check whether the storage exist in pool,
|
||
|
// new one if not exist, the content of storage will be fetched in stateObjects.GetCommittedState()
|
||
|
func (s *StoragePool) getStorage(address common.Address) *sync.Map {
|
||
|
s.RLock()
|
||
|
storageMap, ok := s.sharedMap[address]
|
||
|
s.RUnlock()
|
||
|
if !ok {
|
||
|
s.Lock()
|
||
|
defer s.Unlock()
|
||
|
if storageMap, ok = s.sharedMap[address]; !ok {
|
||
|
m := new(sync.Map)
|
||
|
s.sharedMap[address] = m
|
||
|
return m
|
||
|
}
|
||
|
}
|
||
|
return storageMap
|
||
|
}
|