@@ -42,6 +42,17 @@ type keyBundle struct {
4242 left , right * node
4343}
4444
45+ func (kb * keyBundle ) Dispose () {
46+ kb .key , kb .left , kb .right = nil , nil , nil
47+ keyBundlePool .Put (kb )
48+ }
49+
50+ func newKeyBundle (key common.Comparator ) * keyBundle {
51+ kb := keyBundlePool .Get ().(* keyBundle )
52+ kb .key = key
53+ return kb
54+ }
55+
4556type ptree struct {
4657 root * node
4758 _padding0 [8 ]uint64
@@ -153,12 +164,12 @@ func (ptree *ptree) fetchKeys(xns interfaces, inParallel bool) (map[*node][]*key
153164 switch action .operation () {
154165 case add :
155166 for i , n := range action .nodes () {
156- writeOperations [n ] = append (writeOperations [n ], & keyBundle { key : action .keys ()[i ]} )
167+ writeOperations [n ] = append (writeOperations [n ], newKeyBundle ( action .keys ()[i ]) )
157168 }
158169 toComplete = append (toComplete , action )
159170 case remove :
160171 for i , n := range action .nodes () {
161- deleteOperations [n ] = append (deleteOperations [n ], & keyBundle { key : action .keys ()[i ]} )
172+ deleteOperations [n ] = append (deleteOperations [n ], newKeyBundle ( action .keys ()[i ]) )
162173 }
163174 toComplete = append (toComplete , action )
164175 case get , apply :
@@ -340,6 +351,19 @@ func (ptree *ptree) applyNode(n *node, adds, deletes []*keyBundle) {
340351 }
341352}
342353
354+ func (ptree * ptree ) cleanMap (op map [* node ][]* keyBundle ) {
355+ for _ , bundles := range op {
356+ for _ , kb := range bundles {
357+ kb .Dispose ()
358+ }
359+ }
360+ }
361+
362+ func (ptree * ptree ) cleanMaps (adds , deletes map [* node ][]* keyBundle ) {
363+ ptree .cleanMap (adds )
364+ ptree .cleanMap (deletes )
365+ }
366+
343367func (ptree * ptree ) recursiveMutate (adds , deletes map [* node ][]* keyBundle , setRoot , inParallel bool ) {
344368 if len (adds ) == 0 && len (deletes ) == 0 {
345369 return
@@ -413,12 +437,17 @@ func (ptree *ptree) recursiveMutate(adds, deletes map[*node][]*keyBundle, setRoo
413437 ptree .splitNode (n , parent , & nodes , & keys )
414438 write .Lock ()
415439 for i , k := range keys {
416- nextLayerWrite [parent ] = append (nextLayerWrite [parent ], & keyBundle {key : k , left : nodes [i * 2 ], right : nodes [i * 2 + 1 ]})
440+ kb := newKeyBundle (k )
441+ kb .left = nodes [i * 2 ]
442+ kb .right = nodes [i * 2 + 1 ]
443+ nextLayerWrite [parent ] = append (nextLayerWrite [parent ], kb )
417444 }
418445 write .Unlock ()
419446 }
420447 })
421448
449+ go ptree .cleanMaps (adds , deletes )
450+
422451 ptree .recursiveMutate (nextLayerWrite , nextLayerDelete , setRoot , inParallel )
423452}
424453
0 commit comments