@@ -363,7 +363,7 @@ func (c *Ctrie) Iterator(cancel <-chan struct{}) <-chan *Entry {
363363 ch := make (chan * Entry )
364364 snapshot := c .ReadOnlySnapshot ()
365365 go func () {
366- traverse (snapshot .root , ch , cancel )
366+ snapshot . traverse (snapshot .readRoot () , ch , cancel )
367367 close (ch )
368368 }()
369369 return ch
@@ -385,13 +385,14 @@ func (c *Ctrie) Size() uint {
385385
386386var errCanceled = errors .New ("canceled" )
387387
388- func traverse (i * iNode , ch chan <- * Entry , cancel <- chan struct {}) error {
388+ func (c * Ctrie ) traverse (i * iNode , ch chan <- * Entry , cancel <- chan struct {}) error {
389+ main := gcasRead (i , c )
389390 switch {
390- case i . main .cNode != nil :
391- for _ , br := range i . main .cNode .array {
391+ case main .cNode != nil :
392+ for _ , br := range main .cNode .array {
392393 switch b := br .(type ) {
393394 case * iNode :
394- if err := traverse (b , ch , cancel ); err != nil {
395+ if err := c . traverse (b , ch , cancel ); err != nil {
395396 return err
396397 }
397398 case * sNode :
@@ -402,8 +403,8 @@ func traverse(i *iNode, ch chan<- *Entry, cancel <-chan struct{}) error {
402403 }
403404 }
404405 }
405- case i . main .lNode != nil :
406- for _ , e := range i . main .lNode .Map (func (sn interface {}) interface {} {
406+ case main .lNode != nil :
407+ for _ , e := range main .lNode .Map (func (sn interface {}) interface {} {
407408 return sn .(* sNode ).Entry
408409 }) {
409410 select {
0 commit comments