/// <summary> /// The object to lock. /// </summary> /// <param name="o">The object to lock.</param> /// <param name="timeout">The timeout.</param> /// <returns></returns> /// <exception cref="LockTimeoutException"> /// </exception> public static TimedLock Lock(object o, TimeSpan timeout) { var tl = new TimedLock(o); if (!Monitor.TryEnter(o, timeout)) { #if DEBUG GC.SuppressFinalize(tl._leakDetector); StackTrace blockingTrace; lock (Sentinel.StackTraces) { blockingTrace = Sentinel.StackTraces[o] as StackTrace; } throw new LockTimeoutException(blockingTrace); #else throw new LockTimeoutException(); #endif } #if DEBUG // Lock acquired. Store the stack trace. // var trace = new StackTrace(); // lock (Sentinel.StackTraces) // { // Sentinel.StackTraces.Add(o, trace); // } #endif return tl; }
/// <summary> /// /// </summary> /// <param name="connection"></param> /// <returns></returns> public override bool Close(IConnection connection) { using (TimedLock.Lock(_lock)) { _usedConnections.Remove(connection); if (IsAlive(connection)) { _freeConnections.Enqueue(connection); } } return(true); }
public static IConnectionProvider Get(ConnectionBuilder connectionBuilder) { IConnectionProvider provider; if (!_providers.TryGetValue(connectionBuilder.ConnectionString, out provider)) { using (TimedLock.Lock(_lock)) { provider = CreateProvider(connectionBuilder); _providers.Add(connectionBuilder.ConnectionString, provider); } } return(provider); }
/// <summary> /// The check free connections alive. /// </summary> private void CheckFreeConnectionsAlive() { using (TimedLock.Lock(_lock)) { var freeConnections = _freeConnections.ToArray(); _freeConnections.Clear(); foreach (var free in freeConnections) { if (IsAlive(free)) { _freeConnections.Enqueue(free); } else { base.Close(free); } } } }