@@ -151,13 +151,13 @@ LIBC_INLINE FreeTrie::Node *FreeTrie::find_best_fit(size_t size) {
151
151
Node *deferred_upper_trie = nullptr ;
152
152
FreeTrie::SizeRange deferred_upper_range{0 , 0 };
153
153
154
- // Inductively assume all better fits than the current best are in the
155
- // current subtrie.
156
154
while (true ) {
157
155
LIBC_ASSERT (cur_range.contains (cur->size ()) &&
158
156
" trie node size out of range" );
159
157
LIBC_ASSERT (cur_range.max () >= size &&
160
158
" range could not fit requested size" );
159
+ LIBC_ASSERT ((!best_fit || cur_range.min < best_fit->size ()) &&
160
+ " range could not contain a best fit" );
161
161
162
162
// If the current node is an exact fit, it is a best fit.
163
163
if (cur->size () == size)
@@ -168,19 +168,23 @@ LIBC_INLINE FreeTrie::Node *FreeTrie::find_best_fit(size_t size) {
168
168
best_fit = cur;
169
169
170
170
// If there is a deferred upper subtrie, then the current node is
171
- // somewhere in its lower sibiling subtire . That means that the new best
171
+ // somewhere in its lower sibling subtrie . That means that the new best
172
172
// fit is better than the best fit in the deferred subtrie.
173
173
LIBC_ASSERT (
174
174
!deferred_upper_trie ||
175
- deferred_upper_range.min > cur ->size () &&
175
+ deferred_upper_range.min > best_fit ->size () &&
176
176
" deferred upper subtrie should be outclassed by new best fit" );
177
177
deferred_upper_trie = nullptr ;
178
178
}
179
179
180
- // Determine which subtries might contain better fits .
180
+ // Determine which subtries might contain the best fit .
181
181
bool lower_impossible = !cur->lower || cur_range.lower ().max () < size;
182
182
bool upper_impossible =
183
- !cur->upper || (best_fit && cur_range.upper ().min >= best_fit->size ());
183
+ !cur->upper ||
184
+ // If every node in the lower trie fits
185
+ (!lower_impossible && cur_range.min >= size) ||
186
+ // If every node in the upper trie is worse than the current best
187
+ (best_fit && cur_range.upper ().min >= best_fit->size ());
184
188
185
189
if (lower_impossible && upper_impossible) {
186
190
if (!deferred_upper_trie)
@@ -189,8 +193,7 @@ LIBC_INLINE FreeTrie::Node *FreeTrie::find_best_fit(size_t size) {
189
193
// provides a better fit.
190
194
//
191
195
// This can only ever be reached once. In a deferred upper subtrie, every
192
- // node fits, so the scan can always summarily ignore an upper suptrie
193
- // rather than deferring it.
196
+ // node fits, so the higher of two subtries can never contain a best fit.
194
197
cur = deferred_upper_trie;
195
198
cur_range = deferred_upper_range;
196
199
deferred_upper_trie = nullptr ;
@@ -206,7 +209,8 @@ LIBC_INLINE FreeTrie::Node *FreeTrie::find_best_fit(size_t size) {
206
209
} else {
207
210
// Both subtries might contain a better fit. Any fit in the lower subtrie
208
211
// is better than the any fit in the upper subtrie, so scan the lower
209
- // subtrie and return to the upper one if necessary.
212
+ // and return to the upper only if no better fits were found. (Any better
213
+ // fit found clears the deferred upper subtrie.)
210
214
LIBC_ASSERT (!deferred_upper_trie ||
211
215
cur_range.upper ().max () < deferred_upper_range.min &&
212
216
" old deferred upper subtrie should be outclassed by new" );
0 commit comments