About Social Code
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <mdaenzer@redhat.com>2024-09-13 17:58:40 +0200
committerMarge Bot <emma+marge@anholt.net>2024-10-25 18:06:14 +0000
commitfeef4bf82852766828df3aa5bd826cf887deb496 (patch)
treec6e3bb900efd6fcee3d1b7e6e71b731c72f9f256
parent1ba3996fd5ea5b63107080761dca5caa40036c0f (diff)
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>
-rw-r--r--src/util/mesa_cache_db.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/util/mesa_cache_db.c b/src/util/mesa_cache_db.c
index 4f263989fdb..c79ccf0e367 100644
--- a/src/util/mesa_cache_db.c
+++ b/src/util/mesa_cache_db.c
@@ -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