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 ScanCacheWriterInit(ScanCacheWriter* self, MemAllocHeap* heap) { BinaryWriterInit(&self->m_Writer, heap); self->m_MainSeg = BinaryWriterAddSegment(&self->m_Writer); self->m_DigestSeg = BinaryWriterAddSegment(&self->m_Writer); self->m_DataSeg = BinaryWriterAddSegment(&self->m_Writer); self->m_TimestampSeg = BinaryWriterAddSegment(&self->m_Writer); self->m_ArraySeg = BinaryWriterAddSegment(&self->m_Writer); self->m_StringSeg = BinaryWriterAddSegment(&self->m_Writer); self->m_DigestPtr = BinarySegmentPosition(self->m_DigestSeg); self->m_EntryPtr = BinarySegmentPosition(self->m_DataSeg); self->m_TimestampPtr = BinarySegmentPosition(self->m_TimestampSeg); self->m_RecordsOut = 0; }