public DecorateTransport(TTransport transport, ThriftConnectionStore store, ThriftService service, TransportPoolItem item)
 {
     Contract.Assert(transport != null && item != null && service != null && store != null);
     _transport       = transport;
     _item            = item;
     _service         = service;
     _connectionStore = store;
 }
 public void ReleaseTransport(ThriftService service, TransportPoolItem item)
 {
     lock (this)
     {
         if (_connectionPool.ContainsKey(service))
         {
             _connectionPool[service].SetFree(item);
             Monitor.Pulse(this);
         }
     }
 }
        public TTransport GetOrAdd(ThriftService service, Func <ThriftService, TTransport> createAction)
        {
            Contract.Assert(service != null && createAction != null);
            TransportPoolItem item = null;

            lock (this)
            {
                if (_connectionPool.ContainsKey(service))
                {
                    while (true)
                    {
                        item = _connectionPool[service].GetUsableTransport(() => createAction(service));
                        if (item == null)
                        {
                            Monitor.Wait(this, _waitFreeMillisecond);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else
                {
                    TransportPoolItemCollection collection = new TransportPoolItemCollection(_connectionLimit, _transportOverdueInterval);
                    TTransport transport = createAction(service);
                    if (transport != null)
                    {
                        item = new TransportPoolItem {
                            Transport = transport, IsFree = false, LastUseTime = DateTime.Now
                        };
                        collection.Add(item);
                    }
                    _connectionPool.Add(service, collection);
                }
            }
            if (item != null)
            {
                return(new DecorateTransport(item.Transport, this, service, item));
            }

            return(null);
        }