Lines Matching +full:shader +full:- +full:db
24 /* This is a basic c implementation of a fossilize db like format intended for
25 * use with the Mesa shader cache.
27 * The format is compatible enough to allow the fossilize db tools to be used
28 * to do things like merge db collections.
52 #include "mesa-sha1.h"
65 * makes collisions virtually impossible for our use case. However the foz db
76 shift--; in truncate_hash_to_64bits()
105 if (asprintf(filename, "%s/%s.foz", cache_path, name) == -1) in create_foz_db_filenames()
108 if (asprintf(idx_filename, "%s/%s_idx.foz", cache_path, name) == -1) { in create_foz_db_filenames()
152 if (offset + header->payload_size > len || in update_foz_index()
153 header->payload_size != sizeof(uint64_t)) in update_foz_index()
165 offset += header->payload_size; in update_foz_index()
168 struct foz_db_entry *entry = ralloc(foz_db->mem_ctx, in update_foz_index()
170 entry->header = *header; in update_foz_index()
171 entry->file_idx = file_idx; in update_foz_index()
172 _mesa_sha1_hex_to_sha1(entry->key, hash_str); in update_foz_index()
180 entry->offset = cache_offset; in update_foz_index()
182 _mesa_hash_table_u64_insert(foz_db->index_db, key, entry); in update_foz_index()
220 int err = lock_file_with_timeout(foz_db->file[file_idx], 100000000); in load_foz_dbs()
221 if (err == -1) in load_foz_dbs()
236 FOZ_REF_MAGIC_SIZE - 1)) in load_foz_dbs()
239 int version = magic[FOZ_REF_MAGIC_SIZE - 1]; in load_foz_dbs()
247 sizeof(stream_reference_magic_and_version), foz_db->file[file_idx]) != in load_foz_dbs()
256 fflush(foz_db->file[file_idx]); in load_foz_dbs()
260 flock(fileno(foz_db->file[file_idx]), LOCK_UN); in load_foz_dbs()
262 if (foz_db->updater.thrd) { in load_foz_dbs()
266 simple_mtx_lock(&foz_db->mtx); in load_foz_dbs()
268 simple_mtx_unlock(&foz_db->mtx); in load_foz_dbs()
273 foz_db->alive = true; in load_foz_dbs()
277 flock(fileno(foz_db->file[file_idx]), LOCK_UN); in load_foz_dbs()
294 if (!create_foz_db_filenames(foz_db->cache_path, foz_db_filename, in load_foz_dbs_ro()
302 foz_db->file[file_idx] = fopen(filename, "rb"); in load_foz_dbs_ro()
308 if (!check_files_opened_successfully(foz_db->file[file_idx], db_idx)) { in load_foz_dbs_ro()
310 foz_db->file[file_idx] = NULL; in load_foz_dbs_ro()
317 fclose(foz_db->file[file_idx]); in load_foz_dbs_ro()
318 foz_db->file[file_idx] = NULL; in load_foz_dbs_ro()
320 continue; /* Ignore invalid user provided foz db */ in load_foz_dbs_ro()
339 if (fstat(fileno(db_file), &new_file_stat) == -1) in check_file_already_loaded()
345 if (fstat(fileno(foz_db->file[i]), &loaded_file_stat) == -1) in check_file_already_loaded()
364 if (!foz_db->file[file_idx]) in load_from_list_file()
383 if (!create_foz_db_filenames(foz_db->cache_path, list_entry, in load_from_list_file()
404 foz_db->file[file_idx] = db_file; in load_from_list_file()
409 foz_db->file[file_idx] = NULL; in load_from_list_file()
430 struct foz_dbs_list_updater *updater = &foz_db->updater; in foz_dbs_list_updater_thrd()
433 int len = read(updater->inotify_fd, buf, sizeof(buf)); in foz_dbs_list_updater_thrd()
435 if (len == -1 && errno != EAGAIN) in foz_dbs_list_updater_thrd()
442 i += sizeof(struct inotify_event) + event->len; in foz_dbs_list_updater_thrd()
444 if (event->mask & IN_CLOSE_WRITE) in foz_dbs_list_updater_thrd()
445 load_from_list_file(foz_db, foz_db->updater.list_filename); in foz_dbs_list_updater_thrd()
448 if ((event->mask & IN_DELETE_SELF) || (event->mask & IN_IGNORED)) in foz_dbs_list_updater_thrd()
459 struct foz_dbs_list_updater *updater = &foz_db->updater; in foz_dbs_list_updater_init()
465 updater->list_filename = list_filename; in foz_dbs_list_updater_init()
471 int wd = inotify_add_watch(fd, foz_db->updater.list_filename, in foz_dbs_list_updater_init()
478 updater->inotify_fd = fd; in foz_dbs_list_updater_init()
479 updater->inotify_wd = wd; in foz_dbs_list_updater_init()
481 if (thrd_create(&updater->thrd, foz_dbs_list_updater_thrd, foz_db)) { in foz_dbs_list_updater_init()
493 * db into a hash table. The index db contains the offsets needed to later
494 * read cache entries from the foz db containing the actual cache entries.
502 simple_mtx_init(&foz_db->mtx, mtx_plain); in foz_prepare()
503 simple_mtx_init(&foz_db->flock_mtx, mtx_plain); in foz_prepare()
504 foz_db->mem_ctx = ralloc_context(NULL); in foz_prepare()
505 foz_db->index_db = _mesa_hash_table_u64_create(NULL); in foz_prepare()
506 foz_db->cache_path = cache_path; in foz_prepare()
516 foz_db->file[0] = fopen(filename, "a+b"); in foz_prepare()
517 foz_db->db_idx = fopen(idx_filename, "a+b"); in foz_prepare()
522 if (foz_db->file[0] == NULL || foz_db->db_idx == NULL) in foz_prepare()
525 if (!load_foz_dbs(foz_db, foz_db->db_idx, 0, false)) in foz_prepare()
552 struct foz_dbs_list_updater *updater = &foz_db->updater; in foz_destroy()
553 if (updater->thrd) { in foz_destroy()
554 inotify_rm_watch(updater->inotify_fd, updater->inotify_wd); in foz_destroy()
558 thrd_join(updater->thrd, NULL); in foz_destroy()
559 close(updater->inotify_fd); in foz_destroy()
563 if (foz_db->db_idx) in foz_destroy()
564 fclose(foz_db->db_idx); in foz_destroy()
566 if (foz_db->file[i]) in foz_destroy()
567 fclose(foz_db->file[i]); in foz_destroy()
570 if (foz_db->mem_ctx) { in foz_destroy()
571 _mesa_hash_table_u64_destroy(foz_db->index_db); in foz_destroy()
572 ralloc_free(foz_db->mem_ctx); in foz_destroy()
573 simple_mtx_destroy(&foz_db->flock_mtx); in foz_destroy()
574 simple_mtx_destroy(&foz_db->mtx); in foz_destroy()
591 if (!foz_db->alive) in foz_read_entry()
594 simple_mtx_lock(&foz_db->mtx); in foz_read_entry()
597 _mesa_hash_table_u64_search(foz_db->index_db, hash); in foz_read_entry()
598 if (!entry && foz_db->db_idx) { in foz_read_entry()
599 update_foz_index(foz_db, foz_db->db_idx, 0); in foz_read_entry()
600 entry = _mesa_hash_table_u64_search(foz_db->index_db, hash); in foz_read_entry()
603 simple_mtx_unlock(&foz_db->mtx); in foz_read_entry()
607 uint8_t file_idx = entry->file_idx; in foz_read_entry()
608 if (fseek(foz_db->file[file_idx], entry->offset, SEEK_SET) < 0) in foz_read_entry()
612 if (fread(&entry->header, 1, header_size, foz_db->file[file_idx]) != in foz_read_entry()
620 if (cache_key_160bit[i] != entry->key[i]) in foz_read_entry()
624 uint32_t data_sz = entry->header.payload_size; in foz_read_entry()
626 if (fread(data, 1, data_sz, foz_db->file[file_idx]) != data_sz) in foz_read_entry()
630 if (entry->header.crc != 0) { in foz_read_entry()
631 if (util_hash_crc32(data, data_sz) != entry->header.crc) in foz_read_entry()
635 simple_mtx_unlock(&foz_db->mtx); in foz_read_entry()
645 /* reading db entry failed. reset the file offset */ in foz_read_entry()
646 simple_mtx_unlock(&foz_db->mtx); in foz_read_entry()
651 /* Here we write the cache entry to disk and store its offset in the index db.
659 if (!foz_db->alive || !foz_db->file[0]) in foz_write_entry()
662 /* The flock is per-fd, not per thread, we do it outside of the main mutex to avoid having to in foz_write_entry()
665 simple_mtx_lock(&foz_db->flock_mtx); in foz_write_entry()
669 int err = lock_file_with_timeout(foz_db->file[0], 1000000000); in foz_write_entry()
670 if (err == -1) in foz_write_entry()
673 simple_mtx_lock(&foz_db->mtx); in foz_write_entry()
675 update_foz_index(foz_db, foz_db->db_idx, 0); in foz_write_entry()
678 _mesa_hash_table_u64_search(foz_db->index_db, hash); in foz_write_entry()
680 simple_mtx_unlock(&foz_db->mtx); in foz_write_entry()
681 flock(fileno(foz_db->file[0]), LOCK_UN); in foz_write_entry()
682 simple_mtx_unlock(&foz_db->flock_mtx); in foz_write_entry()
686 /* Prepare db entry header and blob ready for writing */ in foz_write_entry()
693 fseek(foz_db->file[0], 0, SEEK_END); in foz_write_entry()
695 /* Write hash header to db */ in foz_write_entry()
698 if (fwrite(hash_str, 1, FOSSILIZE_BLOB_HASH_LENGTH, foz_db->file[0]) != in foz_write_entry()
702 uint64_t offset = ftell(foz_db->file[0]); in foz_write_entry()
704 /* Write db entry header */ in foz_write_entry()
705 if (fwrite(&header, 1, sizeof(header), foz_db->file[0]) != sizeof(header)) in foz_write_entry()
708 /* Now write the db entry blob */ in foz_write_entry()
709 if (fwrite(blob, 1, blob_size, foz_db->file[0]) != blob_size) in foz_write_entry()
713 fflush(foz_db->file[0]); in foz_write_entry()
715 /* Write hash header to index db */ in foz_write_entry()
716 if (fwrite(hash_str, 1, FOSSILIZE_BLOB_HASH_LENGTH, foz_db->db_idx) != in foz_write_entry()
725 if (fwrite(&header, 1, sizeof(header), foz_db->db_idx) != in foz_write_entry()
729 if (fwrite(&offset, 1, sizeof(uint64_t), foz_db->db_idx) != in foz_write_entry()
734 fflush(foz_db->db_idx); in foz_write_entry()
736 entry = ralloc(foz_db->mem_ctx, struct foz_db_entry); in foz_write_entry()
737 entry->header = header; in foz_write_entry()
738 entry->offset = offset; in foz_write_entry()
739 entry->file_idx = 0; in foz_write_entry()
740 _mesa_sha1_hex_to_sha1(entry->key, hash_str); in foz_write_entry()
741 _mesa_hash_table_u64_insert(foz_db->index_db, hash, entry); in foz_write_entry()
743 simple_mtx_unlock(&foz_db->mtx); in foz_write_entry()
744 flock(fileno(foz_db->file[0]), LOCK_UN); in foz_write_entry()
745 simple_mtx_unlock(&foz_db->flock_mtx); in foz_write_entry()
750 simple_mtx_unlock(&foz_db->mtx); in foz_write_entry()
752 flock(fileno(foz_db->file[0]), LOCK_UN); in foz_write_entry()
753 simple_mtx_unlock(&foz_db->flock_mtx); in foz_write_entry()
762 "built with single cache file support. Shader cache will be disabled" in foz_prepare()