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); }