util/mesa-db: Use single read for whole index

Instead of separate reads per index entry. Should be more efficient.

Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30988>
This commit is contained in:
Michel Dänzer
2024-09-13 17:58:40 +02:00
committed by Marge Bot
parent 1ba3996fd5
commit feef4bf828
+24 -14
View File
@@ -262,48 +262,58 @@ static bool
mesa_db_update_index(struct mesa_cache_db *db)
{
struct mesa_index_db_hash_entry *hash_entry;
struct mesa_index_db_file_entry index_entry;
struct mesa_index_db_file_entry *index_entries, *index_entry;
size_t file_length;
size_t old_entries, new_entries;
size_t new_index_size;
bool ret = false;
int i;
if (!mesa_db_seek_end(db->index.file))
return false;
file_length = ftell(db->index.file);
if (file_length < db->index.offset)
return false;
if (!mesa_db_seek(db->index.file, db->index.offset))
return false;
old_entries = _mesa_hash_table_num_entries(db->index_db->table);
new_entries = (file_length - db->index.offset) / sizeof(index_entry);
new_entries = (file_length - db->index.offset) / sizeof(*index_entries);
_mesa_hash_table_reserve(db->index_db->table, old_entries + new_entries);
while (db->index.offset < file_length) {
if (!mesa_db_read(db->index.file, &index_entry))
break;
new_index_size = new_entries * sizeof(*index_entries);
index_entries = malloc(new_index_size);
if (!mesa_db_read_data(db->index.file, index_entries, new_index_size))
goto error;
for (i = 0, index_entry = index_entries; i < new_entries; i++, index_entry++) {
/* Check whether the index entry looks valid or we have a corrupted DB */
if (!mesa_db_index_entry_valid(&index_entry))
if (!mesa_db_index_entry_valid(index_entry))
break;
hash_entry = ralloc(db->mem_ctx, struct mesa_index_db_hash_entry);
if (!hash_entry)
break;
hash_entry->cache_db_file_offset = index_entry.cache_db_file_offset;
hash_entry->cache_db_file_offset = index_entry->cache_db_file_offset;
hash_entry->index_db_file_offset = db->index.offset;
hash_entry->last_access_time = index_entry.last_access_time;
hash_entry->size = index_entry.size;
hash_entry->last_access_time = index_entry->last_access_time;
hash_entry->size = index_entry->size;
_mesa_hash_table_u64_insert(db->index_db, index_entry.hash, hash_entry);
_mesa_hash_table_u64_insert(db->index_db, index_entry->hash, hash_entry);
db->index.offset += sizeof(index_entry);
db->index.offset += sizeof(*index_entry);
}
if (!mesa_db_seek(db->index.file, db->index.offset))
return false;
if (mesa_db_seek(db->index.file, db->index.offset) &&
db->index.offset == file_length)
ret = true;
return db->index.offset == file_length;
error:
free(index_entries);
return ret;
}
static void