public void ClearParseInformation(FileName fileName)
        {
            ParserServiceEntry entry = GetFileEntry(fileName, false);

            if (entry != null)
            {
                entry.ExpireCache();
            }
        }
 internal void RemoveEntry(ParserServiceEntry entry)
 {
     Debug.Assert(entry.rwLock.IsWriteLockHeld);
     lock (fileEntryDict) {
         ParserServiceEntry entryAtKey;
         if (fileEntryDict.TryGetValue(entry.fileName, out entryAtKey))
         {
             if (entry == entryAtKey)
             {
                 fileEntryDict.Remove(entry.fileName);
             }
         }
     }
 }
 internal void RemoveEntry(ParserServiceEntry entry)
 {
     Debug.Assert(Monitor.IsEntered(entry));
     lock (fileEntryDict) {
         ParserServiceEntry entryAtKey;
         if (fileEntryDict.TryGetValue(entry.fileName, out entryAtKey))
         {
             if (entry == entryAtKey)
             {
                 fileEntryDict.Remove(entry.fileName);
             }
         }
     }
 }
        internal void RegisterForCacheExpiry(ParserServiceEntry entry)
        {
            // This method should not be called within any locks
            Debug.Assert(!(entry.rwLock.IsReadLockHeld || entry.rwLock.IsUpgradeableReadLockHeld || entry.rwLock.IsWriteLockHeld));
            ParserServiceEntry expiredItem = null;

            lock (cacheExpiryQueue) {
                cacheExpiryQueue.Remove(entry);                 // remove entry from queue if it's already enqueued
                if (cacheExpiryQueue.Count >= cachedEntryCount)
                {
                    // dequeue item at front
                    expiredItem = cacheExpiryQueue[0];
                    cacheExpiryQueue.RemoveAt(0);
                }
                cacheExpiryQueue.Add(entry);                 // add entry to back
            }
            if (expiredItem != null)
            {
                expiredItem.ExpireCache();
            }
        }
        ParserServiceEntry GetFileEntry(FileName fileName, bool createIfMissing)
        {
            if (fileName == null)
            {
                throw new ArgumentNullException("fileName");
            }
            ParserServiceEntry entry;

            lock (fileEntryDict) {
                if (!fileEntryDict.TryGetValue(fileName, out entry))
                {
                    if (!createIfMissing)
                    {
                        return(null);
                    }
                    entry = new ParserServiceEntry(this, fileName);
                    fileEntryDict.Add(fileName, entry);
                }
            }
            return(entry);
        }
		internal void RegisterForCacheExpiry(ParserServiceEntry entry)
		{
			// This method should not be called within any locks
			Debug.Assert(!Monitor.IsEntered(entry));
			ParserServiceEntry expiredItem = null;
			lock (cacheExpiryQueue) {
				cacheExpiryQueue.Remove(entry); // remove entry from queue if it's already enqueued
				if (cacheExpiryQueue.Count >= cachedEntryCount) {
					// dequeue item at front
					expiredItem = cacheExpiryQueue[0];
					cacheExpiryQueue.RemoveAt(0);
				}
				cacheExpiryQueue.Add(entry); // add entry to back
			}
			if (expiredItem != null)
				expiredItem.ExpireCache();
		}
		internal void RemoveEntry(ParserServiceEntry entry)
		{
			Debug.Assert(Monitor.IsEntered(entry));
			lock (fileEntryDict) {
				ParserServiceEntry entryAtKey;
				if (fileEntryDict.TryGetValue(entry.fileName, out entryAtKey)) {
					if (entry == entryAtKey)
						fileEntryDict.Remove(entry.fileName);
				}
			}
		}
		ParserServiceEntry GetFileEntry(FileName fileName, bool createIfMissing)
		{
			if (fileName == null)
				throw new ArgumentNullException("fileName");
			ParserServiceEntry entry;
			lock (fileEntryDict) {
				if (!fileEntryDict.TryGetValue(fileName, out entry)) {
					if (!createIfMissing)
						return null;
					entry = new ParserServiceEntry(this, fileName);
					fileEntryDict.Add(fileName, entry);
				}
			}
			return entry;
		}
		internal void RemoveEntry(ParserServiceEntry entry)
		{
			Debug.Assert(entry.rwLock.IsWriteLockHeld);
			lock (fileEntryDict) {
				ParserServiceEntry entryAtKey;
				if (fileEntryDict.TryGetValue(entry.fileName, out entryAtKey)) {
					if (entry == entryAtKey)
						fileEntryDict.Remove(entry.fileName);
				}
			}
		}