void ScanCacheInit(ScanCache* self, MemAllocHeap* heap, MemAllocLinear* allocator) { self->m_FrozenData = nullptr; self->m_Heap = heap; self->m_Allocator = allocator; self->m_RecordCount = 0; self->m_TableSize = 0; self->m_Table = nullptr; self->m_FrozenAccess = nullptr; ReadWriteLockInit(&self->m_Lock); }
void DigestCacheInit(DigestCache* self, size_t heap_size, const char* filename) { ReadWriteLockInit(&self->m_Lock); self->m_State = nullptr; self->m_StateFilename = filename; HeapInit(&self->m_Heap, heap_size, HeapFlags::kDefault); LinearAllocInit(&self->m_Allocator, &self->m_Heap, heap_size / 2, "digest allocator"); MmapFileInit(&self->m_StateFile); HashTableInit(&self->m_Table, &self->m_Heap, HashTable::kFlagPathStrings); self->m_AccessTime = time(nullptr); MmapFileMap(&self->m_StateFile, filename); if (MmapFileValid(&self->m_StateFile)) { const DigestCacheState* state = (const DigestCacheState*) self->m_StateFile.m_Address; if (DigestCacheState::MagicNumber == state->m_MagicNumber) { const uint64_t time_now = time(nullptr); // Throw out records that haven't been accessed in a week. const uint64_t cutoff_time = time_now - 7 * 24 * 60 * 60; self->m_State = state; //HashTablePrepareBulkInsert(&self->m_Table, state->m_Records.GetCount()); for (const FrozenDigestRecord& record : state->m_Records) { if (record.m_AccessTime < cutoff_time) continue; DigestCacheRecord* r = LinearAllocate<DigestCacheRecord>(&self->m_Allocator); r->m_Hash = record.m_FilenameHash; r->m_ContentDigest = record.m_ContentDigest; r->m_Next = nullptr; r->m_String = record.m_Filename.Get(); r->m_Timestamp = record.m_Timestamp; r->m_AccessTime = record.m_AccessTime; HashTableInsert(&self->m_Table, r); } Log(kDebug, "digest cache initialized -- %d entries", state->m_Records.GetCount()); } else { MmapFileUnmap(&self->m_StateFile); } } }