OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package memory | 5 package memory |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "sync" | 9 "sync" |
10 | 10 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 } | 59 } |
60 | 60 |
61 func multiIterate(defs []*iterDefinition, cb func(suffix []byte) bool) { | 61 func multiIterate(defs []*iterDefinition, cb func(suffix []byte) bool) { |
62 ts := make([]*iterator, len(defs)) | 62 ts := make([]*iterator, len(defs)) |
63 prefixLens := make([]int, len(defs)) | 63 prefixLens := make([]int, len(defs)) |
64 for i, def := range defs { | 64 for i, def := range defs { |
65 if def.prefix == nil { | 65 if def.prefix == nil { |
66 panic("got nil prefix") | 66 panic("got nil prefix") |
67 } | 67 } |
68 | 68 |
69 » » end := []byte(nil) | 69 » » // start at the prefix, plus any defined start suffix |
70 » » if def.end != nil { | |
71 » » » end = bjoin(def.prefix, def.end) | |
72 » » } else { | |
73 » » » end = []byte(increment(string(def.prefix), true)) | |
74 » » } | |
75 | |
76 start := def.prefix | 70 start := def.prefix |
77 if def.start != nil { | 71 if def.start != nil { |
78 start = bjoin(def.prefix, def.start) | 72 start = bjoin(def.prefix, def.start) |
79 } | 73 } |
80 | 74 |
| 75 // end at the prefix+1 (if there was a defined prefix), plus any
defined |
| 76 // start suffix. |
| 77 end := []byte(nil) |
| 78 if def.end != nil { |
| 79 end = bjoin(def.prefix, def.end) |
| 80 } else if def.prefix != nil { |
| 81 end = increment(def.prefix) |
| 82 } |
| 83 |
81 ts[i] = newIterator(def.c, start, end) | 84 ts[i] = newIterator(def.c, start, end) |
82 prefixLens[i] = len(def.prefix) | 85 prefixLens[i] = len(def.prefix) |
83 defer ts[i].stop() | 86 defer ts[i].stop() |
84 } | 87 } |
85 | 88 |
86 suffix := []byte(nil) | 89 suffix := []byte(nil) |
87 skip := -1 | 90 skip := -1 |
88 | 91 |
89 for { | 92 for { |
90 stop := false | 93 stop := false |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 t.ch <- &cmd{targ, func(i *gkvlite.Item) { | 223 t.ch <- &cmd{targ, func(i *gkvlite.Item) { |
221 defer close(waiter) | 224 defer close(waiter) |
222 | 225 |
223 cb(i) | 226 cb(i) |
224 if i == nil { | 227 if i == nil { |
225 t.stop() | 228 t.stop() |
226 } | 229 } |
227 }} | 230 }} |
228 <-waiter | 231 <-waiter |
229 } | 232 } |
OLD | NEW |