Example #1
0
        public bool FindRemoveIf(FindIfRemove del, out KeyValuePair <TKey, TValue> kvpout)
        {
            var  kout = default(KeyValuePair <TKey, TValue>);
            bool s    = m_RwLock.AcquireReaderLock(() =>
            {
                foreach (var kvp in m_Dictionary)
                {
                    if (!del(kvp.Key, kvp.Value))
                    {
                        continue;
                    }

                    bool s2 = m_RwLock.UpgradeToWriterLock(() =>
                    {
                        if (m_Dictionary.ContainsKey(kvp.Key))
                        {
                            m_Dictionary.Remove(kvp.Key);
                            kout = kvp;
                            return(true);
                        }
                        return(false);
                    });
                    if (s2)
                    {
                        return(s2);
                    }
                }
                return(false);
            });

            kvpout = kout;
            return(s);
        }
        public bool FindRemoveIf(FindIfRemove del, out KeyValuePair <TKey, TValue> kvpout)
        {
            var  kout = default(KeyValuePair <TKey, TValue>);
            bool s    = m_RwLock.AcquireReaderLock(() =>
            {
                foreach (KeyValuePair <TKey, TValue> kvp in m_Dictionary)
                {
                    if (!del(kvp.Key, kvp.Value))
                    {
                        continue;
                    }
                    LockCookie lc = m_RwLock.UpgradeToWriterLock(-1);
                    try
                    {
                        if (m_Dictionary.ContainsKey(kvp.Key))
                        {
                            m_Dictionary.Remove(kvp.Key);
                            kout = kvp;
                            return(true);
                        }
                    }
                    finally
                    {
                        m_RwLock.DowngradeFromWriterLock(ref lc);
                    }
                }
                return(false);
            });

            kvpout = kout;
            return(s);
        }