120 lines
4.1 KiB
C#
120 lines
4.1 KiB
C#
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<Circuit> Circuits
|
|
{
|
|
get
|
|
{
|
|
_ciruitLock.AcquireReaderLock(_lockTimeout);
|
|
IEnumerable<Circuit> 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<Stream> Streams
|
|
{
|
|
get
|
|
{
|
|
_streamLock.AcquireReaderLock(_lockTimeout);
|
|
IEnumerable<Stream> 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<Circuit> _circuits = new List<Circuit>();
|
|
protected List<Stream> _streams = new List<Stream>();
|
|
protected Int32 _lockTimeout = 5000;
|
|
}
|
|
}
|