diff options
Diffstat (limited to '3rdparty/lzma/CPP/7zip/Common/StreamBinder.h')
-rw-r--r-- | 3rdparty/lzma/CPP/7zip/Common/StreamBinder.h | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/3rdparty/lzma/CPP/7zip/Common/StreamBinder.h b/3rdparty/lzma/CPP/7zip/Common/StreamBinder.h index f3fb53228dd..12088a94586 100644 --- a/3rdparty/lzma/CPP/7zip/Common/StreamBinder.h +++ b/3rdparty/lzma/CPP/7zip/Common/StreamBinder.h @@ -7,11 +7,27 @@ #include "../IStream.h" +/* +We don't use probably UNSAFE version: +reader thread: + _canWrite_Event.Set(); + _readingWasClosed = true + _canWrite_Event.Set(); +writer thread: + _canWrite_Event.Wait() + if (_readingWasClosed) +Can second call of _canWrite_Event.Set() be executed without memory barrier, if event is already set? +*/ + class CStreamBinder { - NWindows::NSynchronization::CManualResetEvent _canWrite_Event; + NWindows::NSynchronization::CAutoResetEvent _canWrite_Event; NWindows::NSynchronization::CManualResetEvent _canRead_Event; NWindows::NSynchronization::CManualResetEvent _readingWasClosed_Event; + + // bool _readingWasClosed; + bool _readingWasClosed2; + // bool WritingWasCut; bool _waitWrite; UInt32 _bufSize; const void *_buf; @@ -20,13 +36,23 @@ public: WRes CreateEvents(); void CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream); + void ReInit(); + HRESULT Read(void *data, UInt32 size, UInt32 *processedSize); HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize); - void CloseRead() { _readingWasClosed_Event.Set(); } + + void CloseRead() + { + _readingWasClosed_Event.Set(); + // _readingWasClosed = true; + // _canWrite_Event.Set(); + } + void CloseWrite() { - // _bufSize must be = 0 + _buf = NULL; + _bufSize = 0; _canRead_Event.Set(); } }; |