public void OnTraceRecordLoadedFromSource(TraceRecord trace) { lock (ThisLock) { if (trace != null && internalCachedTraceRecords != null && trace != null && trace.TraceRecordPos != null) { if (!internalCachedTraceRecords.ContainsKey(trace.FileDescriptor.FilePath)) { internalCachedTraceRecords.Add(trace.FileDescriptor.FilePath, new Dictionary <long, TraceRecord>()); } if (internalCachedTraceRecords[trace.FileDescriptor.FilePath].ContainsKey(trace.TraceRecordPos.FileOffset)) { internalCachedTraceRecords[trace.FileDescriptor.FilePath][trace.TraceRecordPos.FileOffset] = trace; } else { if (internalCachedTraceRecordQueue != null && internalCachedTraceRecordQueue.Count >= 10000) { InternalTraceRecordQueueItem internalTraceRecordQueueItem = internalCachedTraceRecordQueue.Dequeue(); if (internalCachedTraceRecords.ContainsKey(internalTraceRecordQueueItem.filePath) && internalCachedTraceRecords[internalTraceRecordQueueItem.filePath].ContainsKey(internalTraceRecordQueueItem.fileOffset)) { internalCachedTraceRecords[internalTraceRecordQueueItem.filePath].Remove(internalTraceRecordQueueItem.fileOffset); } } internalCachedTraceRecords[trace.FileDescriptor.FilePath].Add(trace.TraceRecordPos.FileOffset, trace); internalCachedTraceRecordQueue.Enqueue(new InternalTraceRecordQueueItem(trace.FileDescriptor.FilePath, trace.TraceRecordPos.FileOffset)); } } } }
private void InvalidateCache(string path) { lock (ThisLock) { if (internalCachedTraceRecords != null && !string.IsNullOrEmpty(path) && internalCachedTraceRecords.ContainsKey(path)) { Dictionary <long, TraceRecord> dictionary = internalCachedTraceRecords[path]; Queue <InternalTraceRecordQueueItem> queue = internalCachedTraceRecordQueue; internalCachedTraceRecordQueue = new Queue <InternalTraceRecordQueueItem>(); while (queue.Count != 0) { InternalTraceRecordQueueItem internalTraceRecordQueueItem = queue.Dequeue(); if (internalTraceRecordQueueItem.filePath != path) { internalCachedTraceRecordQueue.Enqueue(internalTraceRecordQueueItem); } } internalCachedTraceRecords[path].Clear(); internalCachedTraceRecords.Remove(path); internalTraceRecordListCache.Clear(); } } }