internal void PutSession(TdsParserStateObject session) { bool flag2 = session.Deactivate(); if (!this.IsDisposed) { if (flag2 && (this._cachedCount < 10)) { if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.PutSession|ADV> %d# keeping session %d cachedCount=%d\n", this.ObjectID, session.ObjectID, this._cachedCount); } this._freeStack.SynchronizedPush(session); } else { if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.PutSession|ADV> %d# disposing session %d cachedCount=%d\n", this.ObjectID, session.ObjectID, this._cachedCount); } lock (this._cache) { this._cache.Remove(session); this._cachedCount = this._cache.Count; } session.Dispose(); } } }
internal void PutSession(TdsParserStateObject session) { Debug.Assert(null != session, "null session?"); bool okToReuse; _parser.Connection._parserLock.Wait(canReleaseFromAnyThread: false); try { okToReuse = session.Deactivate(); } finally { _parser.Connection._parserLock.Release(); } bool disposeSession = false; lock (_cache) { if (IsDisposed) { // We're diposed - just clean out the session Debug.Assert(_cache.Count == 0, "SessionPool is disposed, but there are still sessions in the cache?"); disposeSession = true; } else if ((okToReuse) && (_freeStateObjectCount < MaxInactiveCount)) { // Session is good to re-use and our cache has space Debug.Assert(!session._pendingData, "pending data on a pooled session?"); _freeStateObjects[_freeStateObjectCount] = session; _freeStateObjectCount++; } else { // Either the session is bad, or we have no cache space - so dispose the session and remove it bool removed = _cache.Remove(session); Debug.Assert(removed, "session not in pool?"); disposeSession = true; } session.RemoveOwner(); } if (disposeSession) { _parser.Connection._parserLock.Wait(canReleaseFromAnyThread: false); try { session.Dispose(); } finally { _parser.Connection._parserLock.Release(); } } }
internal void PutSession(TdsParserStateObject session) { Debug.Assert(null != session, "null session?"); //Debug.Assert(null != session.Owner, "session without owner?"); bool okToReuse = session.Deactivate(); lock (_cache) { if (IsDisposed) { // We're diposed - just clean out the session Debug.Assert(_cachedCount == 0, "SessionPool is disposed, but there are still sessions in the cache?"); session.Dispose(); } else if ((okToReuse) && (_freeStateObjectCount < MaxInactiveCount)) { // Session is good to re-use and our cache has space if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.PutSession|ADV> %d# keeping session %d cachedCount=%d\n", ObjectID, session.ObjectID, _cachedCount); } Debug.Assert(!session._pendingData, "pending data on a pooled session?"); _freeStateObjects[_freeStateObjectCount] = session; _freeStateObjectCount++; } else { // Either the session is bad, or we have no cache space - so dispose the session and remove it if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.PutSession|ADV> %d# disposing session %d cachedCount=%d\n", ObjectID, session.ObjectID, _cachedCount); } bool removed = _cache.Remove(session); Debug.Assert(removed, "session not in pool?"); _cachedCount = _cache.Count; session.Dispose(); } session.RemoveOwner(); } }
internal void Dispose() { if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.Dispose|ADV> %d# disposing cachedCount=%d\n", this.ObjectID, this._cachedCount); } this._freeStack = null; lock (this._cache) { for (int i = 0; i < this._cache.Count; i++) { TdsParserStateObject obj2 = this._cache[i]; if (obj2 != null) { obj2.Dispose(); } } this._cache.Clear(); } }