protected void Clear(bool assertOpen) { if (assertOpen) { AssertOpen(); } KeyLock.AcquireReaderLock(new TimeSpan(-1)); try { foreach (KeyValuePair <TKey, Threading.IQueue <TimeRecord <TItem> > > entry in Keys) { Threading.IQueue <TimeRecord <TItem> > pool = entry.Value; while (!pool.IsEmpty()) { TimeRecord <TItem> record = pool.Poll(); if (record != null) { Destroy(entry.Key, record.Item, false); } } } } finally { KeyLock.ReleaseReaderLock(); } }
private void EvictIdleItems(object source, ElapsedEventArgs e) { AssertOpen(); TimeSpan noWait = new TimeSpan(0); evictionTimer.Stop(); KeyLock.AcquireReaderLock(new TimeSpan(-1)); try { try { foreach (KeyValuePair <TKey, Threading.IQueue <TimeRecord <TItem> > > entry in Keys) { Threading.IQueue <TimeRecord <TItem> > pool = entry.Value; TimeRecord <TItem> record; while ((record = pool.Peek()) != null) { if (evictionCriteria.Evict(record, pool.Size())) { record = pool.Poll(noWait); if (record != null) { ShrinkPool(entry.Key, record.Item); } } else { break; } } } } catch (Exception x) { Logger.Error(x.Message); } } finally { KeyLock.ReleaseReaderLock(); evictionTimer.Start(); } }
protected AbstractPool(string instanceName, IPooledItemFactory <TItem> factory, Threading.IQueue <TimeRecord <TItem> > pool, EvictionCriteria evictionCriteria) { this.instanceName = instanceName; this.factory = factory; this.pool = pool; this.evictionCriteria = evictionCriteria; // setup eviction timer evictionTimer = new Timer(); evictionTimer.Interval = evictionCriteria.Interval.TotalMilliseconds; evictionTimer.Elapsed += EvictIdleItems; evictionTimer.Start(); // item leak timer leakTimer = new Timer(); leakTimer.Interval = 1000; leakTimer.Elapsed += ProcessLeakedItems; leakTimer.Start(); }