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();
                }
            }
        }
Beispiel #2
0
        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();
     }
 }