Files
Hermes/Hermes/CircuitManagers/CircuitManagerBase.cs
2022-06-11 16:42:18 -04:00

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