/// <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;
		}
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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);
                    }
                }
            }
        }