2019-12-04 15:42:30 -08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Compress.ThreadReaders
|
|
|
|
|
|
{
|
|
|
|
|
|
public class ThreadCRC : IDisposable
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
private Utils.CRC crc;
|
2019-12-04 15:42:30 -08:00
|
|
|
|
private readonly AutoResetEvent _waitEvent;
|
|
|
|
|
|
private readonly AutoResetEvent _outEvent;
|
|
|
|
|
|
private readonly Thread _tWorker;
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] _buffer;
|
|
|
|
|
|
private int _size;
|
|
|
|
|
|
private bool _finished;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ThreadCRC()
|
|
|
|
|
|
{
|
2020-04-03 13:19:21 -07:00
|
|
|
|
crc = new Utils.CRC();
|
2019-12-04 15:42:30 -08:00
|
|
|
|
_waitEvent = new AutoResetEvent(false);
|
|
|
|
|
|
_outEvent = new AutoResetEvent(false);
|
|
|
|
|
|
_finished = false;
|
|
|
|
|
|
|
|
|
|
|
|
_tWorker = new Thread(MainLoop);
|
|
|
|
|
|
_tWorker.Start();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public byte[] Hash => crc.Crc32ResultB;
|
|
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
|
{
|
|
|
|
|
|
_waitEvent.Dispose();
|
|
|
|
|
|
_outEvent.Dispose();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void MainLoop()
|
|
|
|
|
|
{
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
{
|
|
|
|
|
|
_waitEvent.WaitOne();
|
|
|
|
|
|
if (_finished)
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-04-03 13:19:21 -07:00
|
|
|
|
crc.SlurpBlock(_buffer, 0, _size);
|
2019-12-04 15:42:30 -08:00
|
|
|
|
|
|
|
|
|
|
_outEvent.Set();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Trigger(byte[] buffer, int size)
|
|
|
|
|
|
{
|
|
|
|
|
|
_buffer = buffer;
|
|
|
|
|
|
_size = size;
|
|
|
|
|
|
_waitEvent.Set();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Wait()
|
|
|
|
|
|
{
|
|
|
|
|
|
_outEvent.WaitOne();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Finish()
|
|
|
|
|
|
{
|
|
|
|
|
|
_finished = true;
|
|
|
|
|
|
_waitEvent.Set();
|
|
|
|
|
|
_tWorker.Join();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|