| Index: content/child/blob_storage/blob_consolidation.cc
|
| diff --git a/content/child/blob_storage/blob_consolidation.cc b/content/child/blob_storage/blob_consolidation.cc
|
| index ffcd12f089eefa839ef4ab3e0e1d5c0e07e5f60b..39d74971a504e6f4a53c29e969faf140c764dd87 100644
|
| --- a/content/child/blob_storage/blob_consolidation.cc
|
| +++ b/content/child/blob_storage/blob_consolidation.cc
|
| @@ -126,47 +126,28 @@ ReadStatus BlobConsolidation::VisitMemory(size_t consolidated_item_index,
|
| }
|
|
|
| // We do a binary search to find the correct data to start with in the data
|
| - // elements. This is slightly customized due to our unique storage and
|
| - // constraints.
|
| - size_t mid = 0;
|
| - size_t offset_from_mid = consolidated_offset;
|
| + // elements.
|
| + const auto& offsets = item.offsets;
|
| + size_t item_index =
|
| + std::upper_bound(offsets.begin(), offsets.end(), consolidated_offset) -
|
| + offsets.begin();
|
| + uint64_t item_offset = item_index == 0
|
| + ? consolidated_offset
|
| + : consolidated_offset - offsets[item_index - 1];
|
| +
|
| + DCHECK_LT(item_offset, item.data[item_index].size());
|
| + // Read starting from 'item_index' and 'item_offset'.
|
| size_t num_items = item.data.size();
|
| - if (!item.offsets.empty()) {
|
| - size_t low = 0;
|
| - size_t high = num_items - 1;
|
| - while (true) {
|
| - mid = (high + low) / 2;
|
| - // Note: we don't include the implicit '0' for the first item in offsets.
|
| - size_t item_offset = (mid == 0 ? 0 : item.offsets[mid - 1]);
|
| - offset_from_mid = consolidated_offset - item_offset;
|
| - size_t next_item_offset = (mid + 1 == num_items ? 0 : item.offsets[mid]);
|
| - if (item_offset == consolidated_offset) {
|
| - // found exact match.
|
| - break;
|
| - } else if (item_offset > consolidated_offset) {
|
| - high = mid - 1;
|
| - } else if (mid + 1 == num_items ||
|
| - next_item_offset > consolidated_offset) {
|
| - // We are at the last item, or the next offset is greater than the one
|
| - // we want, so the current item wins.
|
| - break;
|
| - } else {
|
| - low = mid + 1;
|
| - }
|
| - }
|
| - }
|
| -
|
| - DCHECK_LT(offset_from_mid, item.data[mid].size());
|
| - // Read starting from 'mid' and 'offset_from_mid'.
|
| for (size_t memory_read = 0;
|
| - mid < num_items && memory_read < consolidated_size; mid++) {
|
| - size_t read_size = std::min(item.data[mid].size() - offset_from_mid,
|
| + item_index < num_items && memory_read < consolidated_size;
|
| + item_index++) {
|
| + size_t read_size = std::min(item.data[item_index].size() - item_offset,
|
| consolidated_size - memory_read);
|
| bool continu =
|
| - visitor.Run(item.data[mid].data() + offset_from_mid, read_size);
|
| + visitor.Run(item.data[item_index].data() + item_offset, read_size);
|
| if (!continu)
|
| return ReadStatus::CANCELLED_BY_VISITOR;
|
| - offset_from_mid = 0;
|
| + item_offset = 0;
|
| memory_read += read_size;
|
| }
|
| return ReadStatus::OK;
|
|
|