refactor(crc): убрать повторные чтения файлов в FileCRC (буферный API)#3373
Merged
Conversation
c434a03 to
70d967f
Compare
Готовит почву для устранения повторных чтений файлов в CRC-подсистеме. Общий внутренний сеттер set_crc_field (upsert + поле по типу файла); update_from_content переведён на него и снова поддерживает все три типа. Добавлено: - reset(uid, mode) -- сброс CRC в 0 для удалённого файла; - verify_from_content(uid, mode, buf, len) -> bool -- сверка CRC из готового буфера вместо повторного чтения файла на загрузке. tests/file_crc.cpp покрывает roundtrip, обнаружение расхождений, reset, базовый снимок и независимость типов файлов. Refs #3368
…вания - Crash_delete_files: вместо check_crc на уже удалённом файле (чтобы получить 0 повторным чтением) -- прямой FileCRC::reset. - Загрузка .obj: сверка CRC из уже прочитанного буфера readdata через verify_from_content, без второго чтения файла. В ветке ошибки чтения бессмысленная сверка перечитыванием убрана (валидного буфера нет). Refs #3368
- ReadCrashTimerFile: файл читается целиком в буфер, CRC сверяется из него (verify_from_content), записи парсятся из того же буфера -- без второго чтения. Заодно починена утечка дескриптора в ветке "corrupt". - Загрузка pfile: сверка CRC из fb-буфера (весь файл уже в памяти) до fbclose, без повторного чтения. Refs #3368
3135620 to
92472d3
Compare
pfile теперь пишется в BufferedFileWriter (printf-совместимый писатель в std::string через vsnprintf -- без переполнения при любой длине поля), а CRC считается из этого буфера (update_from_content), без перечитывания только что записанного файла. Файл пишется в бинарном режиме (байты == буфер на всех платформах). Переведены на BufferedFileWriter все цепочки записи pfile: - Player::save_char + quested_save/mobmax_save; - save_pkills (pk.cpp); - Quested::save, MobMax::save. tests/buffered_file_writer.cpp -- golden-тесты writer'а (совпадение с snprintf, длинные поля без обрезки). Refs #3368
После перевода всех путей (сохранение, загрузка, удаление) на буферный API (update_from_content/verify_from_content/reset) у check_crc и calculate_file_crc не осталось вызовов -- FileCRC больше не читает файлы сам, а работает с буферами, которые вызывающий код и так держит в памяти. Refs #3368
92472d3 to
8131d42
Compare
enum EType { kPlayer, kTextObjs, kTimeObjs } (unscoped, в namespace
FileCRC) вместо анонимного int-enum с PLAYER/.../UPDATE_*. update/reset/
verify_from_content берут EType; switch'и исчерпывающие -- компилятор
ловит непокрытый кейс, рантайм-проверки "неподдерживаемый режим" убраны.
Глагол (запись, сверка, сброс) и так в имени функции, поэтому UPDATE_-
варианты схлопнуты. Вызовы двухкомпонентные: FileCRC::kTextObjs.
Refs #3368
8131d42 to
2bd9cf0
Compare
На clang-cl новые тест-файлы оказывались первыми в unity-чанке и тянули utils/*.h -> conf.h/sysdep.h -> structs.h -> <vector> раньше системных заголовков, ломая интринсик-заголовки MSVC/clang (mmintrin.h, __v2si). Подключаем <gtest/gtest.h> первым, как в остальных тестах. Refs #3368
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Вторая часть оптимизации CRC-подсистемы (продолжение #3369, цель — ветка PR #3369). Убирает все повторные чтения файлов в
FileCRC: подсистема больше не читает файлы сама, а считает/сверяет CRC из буферов, которые вызывающий код и так держит в памяти.Что сделано
FileCRC:update_from_content(запись),verify_from_content→bool(сверка),reset(сброс для удалённого файла) поверх общего внутреннего сеттера..obj/.time/pfile: сверка CRC из уже прочитанного буфера вместо второго чтения файла.ReadCrashTimerFileпереписан на «слить в буфер → сверить → парсить из буфера» (заодно починена утечка дескриптора в ветке corrupt).Crash_delete_files): прямойresetвместоcheck_crcна уже удалённом файле.fprintf(FILE*)наBufferedFileWriter— printf-совместимый писатель вstd::stringчерезvsnprintf(без переполнения при любой длине поля, в отличие от legacyfbprintf/vsprintf). CRC из буфера, файл пишется бинарно.check_crcиcalculate_file_crc—FileCRCбольше не делает файлового I/O.Тесты
tests/file_crc.cpp— буферный API (roundtrip, обнаружение расхождения, reset, базовый снимок, независимость типов файлов).tests/buffered_file_writer.cpp— golden-тесты writer'а (побайтовое совпадение сsnprintf, длинные поля без обрезки).Refs #3368