Exemple #1
0
        /// <summary>
        /// Add the given string to the cache or return the existing string if it is already
        /// in the cache.
        /// Constant time operation.
        /// </summary>
        public string Add(string key, XmlDocument document)
        {
            if (key.Length == 0)
            {
                return(String.Empty);
            }

            // see Microsoft.Build.BackEnd.BuildRequestConfiguration.CreateUniqueGlobalProperty
            if (key.StartsWith(MSBuildConstants.MSBuildDummyGlobalPropertyHeader, StringComparison.Ordinal))
            {
                return(key);
            }

            lock (_locker)
            {
                VerifyState();

                StringCacheEntry           entry;
                HashSet <StringCacheEntry> entries;

                bool seenString   = _strings.TryGetValue(key, out entry);
                bool seenDocument = _documents.TryGetValue(document, out entries);

                if (!seenString)
                {
                    entry = new StringCacheEntry(key);
                    _strings.Add(entry);
                }

                if (!seenDocument)
                {
                    entries = new HashSet <StringCacheEntry>();
                    _documents.Add(document, entries);
                }

                bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry);

                if (!seenStringInThisDocument)
                {
                    entries.Add(entry);

                    // We've been referred to by a new document, so increment our ref count.
                    entry.Increment();
                }

                VerifyState();

                return(entry.CachedString);
            }
        }
Exemple #2
0
        /// <summary>
        /// Add the given string to the cache or return the existing string if it is already
        /// in the cache.
        /// Constant time operation.
        /// </summary>
        public string Add(string key, XmlDocument document)
        {
            if (key.Length == 0)
            {
                return(String.Empty);
            }

            lock (_locker)
            {
                VerifyState();

                StringCacheEntry           entry;
                HashSet <StringCacheEntry> entries;

                bool seenString   = _strings.TryGetValue(key, out entry);
                bool seenDocument = _documents.TryGetValue(document, out entries);

                if (!seenString)
                {
                    entry = new StringCacheEntry(key);
                    _strings.Add(entry);
                }

                if (!seenDocument)
                {
                    entries = new HashSet <StringCacheEntry>();
                    _documents.Add(document, entries);
                }

                bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry);

                if (!seenStringInThisDocument)
                {
                    entries.Add(entry);

                    // We've been referred to by a new document, so increment our ref count.
                    entry.Increment();
                }

                VerifyState();

                return(entry.CachedString);
            }
        }
Exemple #3
0
        /// <summary>
        /// Add the given string to the cache or return the existing string if it is already
        /// in the cache.
        /// Constant time operation.
        /// </summary>
        public string Add(string key, XmlDocument document)
        {
            if (key.Length == 0)
            {
                return String.Empty;
            }

            lock (_locker)
            {
                VerifyState();

                StringCacheEntry entry;
                HashSet<StringCacheEntry> entries;

                bool seenString = _strings.TryGetValue(key, out entry);
                bool seenDocument = _documents.TryGetValue(document, out entries);

                if (!seenString)
                {
                    entry = new StringCacheEntry(key);
                    _strings.Add(entry);
                }

                if (!seenDocument)
                {
                    entries = new HashSet<StringCacheEntry>();
                    _documents.Add(document, entries);
                }

                bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry);

                if (!seenStringInThisDocument)
                {
                    entries.Add(entry);

                    // We've been referred to by a new document, so increment our ref count.
                    entry.Increment();
                }

                VerifyState();

                return entry.CachedString;
            }
        }