using System; using System.Collections.Generic; using System.Linq; using System.Text; using Hermes.Objects; using System.Threading; namespace Hermes.CircuitManagers { public abstract class CircuitManagerBase { #region Circuits public virtual void AddCircuit(Circuit circuit) { _ciruitLock.AcquireWriterLock(_lockTimeout); _circuits.Add(circuit); _ciruitLock.ReleaseWriterLock(); } public virtual void RemoveCircuit(Circuit circuit) { _ciruitLock.AcquireWriterLock(_lockTimeout); if (circuit != null && circuit.AttachedStreams.Count > 0) { circuit.AttachedStreams.ForEach(p => p.Attached = false); circuit.AttachedStreams.Clear(); } _circuits.Remove(circuit); _ciruitLock.ReleaseWriterLock(); } public virtual Circuit GetCircuit(Int32 circuitID) { _ciruitLock.AcquireReaderLock(_lockTimeout); Circuit circ = _circuits.FirstOrDefault(p => p.CircuitID.Equals(circuitID)); _ciruitLock.ReleaseReaderLock(); return circ; } public IEnumerable Circuits { get { _ciruitLock.AcquireReaderLock(_lockTimeout); IEnumerable array = _circuits.ToArray(); _ciruitLock.ReleaseReaderLock(); return array; } } #endregion #region Streams public virtual void RemoveStream(Int32 circuitID, Int32 streamID) { _streamLock.AcquireReaderLock(_lockTimeout); Stream stream = _streams.FirstOrDefault(p => p.StreamID.Equals(streamID)); _streamLock.ReleaseReaderLock(); if (stream != null) RemoveStream(circuitID, stream); } public virtual void RemoveStream(Int32 circuitID, Stream stream) { _streamLock.AcquireWriterLock(_lockTimeout); _streams.Remove(stream); _streamLock.ReleaseWriterLock(); _ciruitLock.AcquireReaderLock(_lockTimeout); Circuit circ = _circuits.FirstOrDefault(p => p.CircuitID.Equals(circuitID)); if (circ != null) { circ.AttachedStreams.Remove(stream); stream.Attached = false; } _ciruitLock.ReleaseReaderLock(); } public virtual void RemoveStream(Stream stream) { RemoveStream(stream.CircuitID, stream); } public virtual Stream GetStream(Int32 streamID) { _streamLock.AcquireReaderLock(_lockTimeout); Stream stream = _streams.FirstOrDefault(p => p.StreamID.Equals(streamID)); _streamLock.ReleaseReaderLock(); return stream; } public IEnumerable Streams { get { _streamLock.AcquireReaderLock(_lockTimeout); IEnumerable array = _streams.ToArray(); _streamLock.ReleaseReaderLock(); return array; } } #endregion public virtual void AssignStreamToCircuit(Stream stream, Circuit circuit) { _ciruitLock.AcquireWriterLock(_lockTimeout); try { circuit.AttachedStreams.Add(stream); stream.Circuit = circuit; stream.Attached = true; } catch (Exception e) { throw e; } finally { _ciruitLock.ReleaseWriterLock(); } _streamLock.AcquireWriterLock(_lockTimeout); _streams.Add(stream); _streamLock.ReleaseWriterLock(); } protected ReaderWriterLock _ciruitLock = new ReaderWriterLock(); protected ReaderWriterLock _streamLock = new ReaderWriterLock(); protected List _circuits = new List(); protected List _streams = new List(); protected Int32 _lockTimeout = 5000; } }