internal TdsParserStateObject GetSession(object owner) { TdsParserStateObject session; lock (_cache) { if (IsDisposed) { throw ADP.ClosedConnectionError(); } else if (_freeStateObjectCount > 0) { // Free state object - grab it _freeStateObjectCount--; session = _freeStateObjects[_freeStateObjectCount]; _freeStateObjects[_freeStateObjectCount] = null; Debug.Assert(session != null, "There was a null session in the free session list?"); } else { // No free objects, create a new one session = _parser.CreateSession(); _cache.Add(session); _cachedCount = _cache.Count; } session.Activate(owner); } return(session); }
internal TdsParserStateObject GetSession(object owner) { TdsParserStateObject session; bool createSession = false; lock (_cache) { if (IsDisposed) { throw ADP.ClosedConnectionError(); } else if (_freeStateObjectCount > 0) { // Free state object - grab it _freeStateObjectCount--; session = _freeStateObjects[_freeStateObjectCount]; _freeStateObjects[_freeStateObjectCount] = null; Debug.Assert(session != null, "There was a null session in the free session list?"); } else { // No free objects, create a new on session = null; createSession = true; } } if (createSession) { _parser.Connection._parserLock.Wait(canReleaseFromAnyThread: false); try { session = _parser.CreateSession(); } finally { _parser.Connection._parserLock.Release(); } lock (_cache) { _cache.Add(session); } } session.Activate(owner); return(session); }
internal TdsParserStateObject GetSession(object owner) { TdsParserStateObject session; lock (_cache) { if (IsDisposed) { throw ADP.ClosedConnectionError(); } else if (_freeStateObjectCount > 0) { // Free state object - grab it _freeStateObjectCount--; session = _freeStateObjects[_freeStateObjectCount]; _freeStateObjects[_freeStateObjectCount] = null; Debug.Assert(session != null, "There was a null session in the free session list?"); } else { // No free objects, create a new one session = _parser.CreateSession(); if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.CreateSession|ADV> %d# adding session %d to pool\n", ObjectID, session.ObjectID); } _cache.Add(session); _cachedCount = _cache.Count; } session.Activate(owner); } if (Bid.AdvancedOn) { Bid.Trace("<sc.TdsParserSessionPool.GetSession|ADV> %d# using session %d\n", ObjectID, session.ObjectID); } return(session); }