mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-24 05:36:46 +00:00
trie: add sync pool
This commit is contained in:
parent
a80f906f09
commit
4c85ff8ca5
2 changed files with 21 additions and 2 deletions
|
|
@ -110,10 +110,19 @@ func (h *hasher) encodeShortNode(n *shortNode) []byte {
|
|||
return h.encodedBytes()
|
||||
}
|
||||
|
||||
var fnEncoderPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
var enc fullnodeEncoder
|
||||
return &enc
|
||||
},
|
||||
}
|
||||
|
||||
// encodeFullNode returns a copy of the supplied fullNode, with its child
|
||||
// being replaced by either the hash or an embedded node if the child is small.
|
||||
func (h *hasher) encodeFullNode(n *fullNode) []byte {
|
||||
var fn fullnodeEncoder
|
||||
fn := fnEncoderPool.Get().(*fullnodeEncoder)
|
||||
fn.reset()
|
||||
|
||||
if h.parallel {
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < 16; i++ {
|
||||
|
|
@ -142,6 +151,8 @@ func (h *hasher) encodeFullNode(n *fullNode) []byte {
|
|||
fn.Children[16] = n.Children[16].(valueNode)
|
||||
}
|
||||
fn.encode(h.encbuf)
|
||||
fnEncoderPool.Put(fn)
|
||||
|
||||
return h.encodedBytes()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ func (n *fullNode) encode(w rlp.EncoderBuffer) {
|
|||
func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) {
|
||||
offset := w.List()
|
||||
for i, c := range n.Children {
|
||||
if c == nil {
|
||||
if len(c) == 0 {
|
||||
w.Write(rlp.EmptyString)
|
||||
} else {
|
||||
if i == 16 {
|
||||
|
|
@ -60,6 +60,14 @@ func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) {
|
|||
w.ListEnd(offset)
|
||||
}
|
||||
|
||||
func (n *fullnodeEncoder) reset() {
|
||||
for i, c := range n.Children {
|
||||
if len(c) != 0 {
|
||||
n.Children[i] = n.Children[i][:0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (n *shortNode) encode(w rlp.EncoderBuffer) {
|
||||
offset := w.List()
|
||||
w.WriteBytes(n.Key)
|
||||
|
|
|
|||
Loading…
Reference in a new issue