bool DigestCacheSave(DigestCache* self, MemAllocHeap* serialization_heap, const char* tmp_filename) { TimingScope timing_scope(nullptr, &g_Stats.m_DigestCacheSaveTimeCycles); BinaryWriter writer; BinaryWriterInit(&writer, serialization_heap); BinarySegment *main_seg = BinaryWriterAddSegment(&writer); BinarySegment *array_seg = BinaryWriterAddSegment(&writer); BinarySegment *string_seg = BinaryWriterAddSegment(&writer); BinaryLocator array_ptr = BinarySegmentPosition(array_seg); auto save_record = [=](size_t index, const HashRecord* hr) { const DigestCacheRecord* r = (const DigestCacheRecord*) hr; BinarySegmentWriteUint64(array_seg, r->m_Timestamp); BinarySegmentWriteUint64(array_seg, r->m_AccessTime); BinarySegmentWriteUint32(array_seg, r->m_Hash); BinarySegmentWrite(array_seg, &r->m_ContentDigest, sizeof(r->m_ContentDigest)); BinarySegmentWritePointer(array_seg, BinarySegmentPosition(string_seg)); BinarySegmentWriteStringData(string_seg, r->m_String); BinarySegmentWriteUint32(array_seg, 0); // m_Padding #if ENABLED(USE_FAST_HASH) BinarySegmentWriteUint32(array_seg, 0); // m_Padding #endif }; HashTableWalk(&self->m_Table, save_record); BinarySegmentWriteUint32(main_seg, DigestCacheState::MagicNumber); BinarySegmentWriteInt32(main_seg, (int) self->m_Table.m_RecordCount); BinarySegmentWritePointer(main_seg, array_ptr); // Unmap old state to avoid sharing conflicts on Windows. MmapFileUnmap(&self->m_StateFile); self->m_State = nullptr; bool success = BinaryWriterFlush(&writer, tmp_filename); if (success) { success = RenameFile(tmp_filename, self->m_StateFilename); } else { remove(tmp_filename); } BinaryWriterDestroy(&writer); return success; }
static void ScanCacheWriterDestroy(ScanCacheWriter* self) { BinaryWriterDestroy(&self->m_Writer); }