diff options
| author | Michel Dänzer <mdaenzer@redhat.com> | 2024-09-13 17:58:40 +0200 |
|---|---|---|
| committer | Marge Bot <emma+marge@anholt.net> | 2024-10-25 18:06:14 +0000 |
| commit | feef4bf82852766828df3aa5bd826cf887deb496 (patch) | |
| tree | c6e3bb900efd6fcee3d1b7e6e71b731c72f9f256 | |
| parent | 1ba3996fd5ea5b63107080761dca5caa40036c0f (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.c | 38 |
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 |