| /* MtCoder.h -- Multi-thread Coder |
| 2009-11-19 : Igor Pavlov : Public domain */ |
| |
| #ifndef __MT_CODER_H |
| #define __MT_CODER_H |
| |
| #include "Threads.h" |
| |
| EXTERN_C_BEGIN |
| |
| typedef struct |
| { |
| CThread thread; |
| CAutoResetEvent startEvent; |
| CAutoResetEvent finishedEvent; |
| int stop; |
| |
| THREAD_FUNC_TYPE func; |
| LPVOID param; |
| THREAD_FUNC_RET_TYPE res; |
| } CLoopThread; |
| |
| void LoopThread_Construct(CLoopThread *p); |
| void LoopThread_Close(CLoopThread *p); |
| WRes LoopThread_Create(CLoopThread *p); |
| WRes LoopThread_StopAndWait(CLoopThread *p); |
| WRes LoopThread_StartSubThread(CLoopThread *p); |
| WRes LoopThread_WaitSubThread(CLoopThread *p); |
| |
| #ifndef _7ZIP_ST |
| #define NUM_MT_CODER_THREADS_MAX 32 |
| #else |
| #define NUM_MT_CODER_THREADS_MAX 1 |
| #endif |
| |
| typedef struct |
| { |
| UInt64 totalInSize; |
| UInt64 totalOutSize; |
| ICompressProgress *progress; |
| SRes res; |
| CCriticalSection cs; |
| UInt64 inSizes[NUM_MT_CODER_THREADS_MAX]; |
| UInt64 outSizes[NUM_MT_CODER_THREADS_MAX]; |
| } CMtProgress; |
| |
| SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize); |
| |
| struct _CMtCoder; |
| |
| typedef struct |
| { |
| struct _CMtCoder *mtCoder; |
| Byte *outBuf; |
| size_t outBufSize; |
| Byte *inBuf; |
| size_t inBufSize; |
| unsigned index; |
| CLoopThread thread; |
| |
| Bool stopReading; |
| Bool stopWriting; |
| CAutoResetEvent canRead; |
| CAutoResetEvent canWrite; |
| } CMtThread; |
| |
| typedef struct |
| { |
| SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize, |
| const Byte *src, size_t srcSize, int finished); |
| } IMtCoderCallback; |
| |
| typedef struct _CMtCoder |
| { |
| size_t blockSize; |
| size_t destBlockSize; |
| unsigned numThreads; |
| |
| ISeqInStream *inStream; |
| ISeqOutStream *outStream; |
| ICompressProgress *progress; |
| ISzAlloc *alloc; |
| |
| IMtCoderCallback *mtCallback; |
| CCriticalSection cs; |
| SRes res; |
| |
| CMtProgress mtProgress; |
| CMtThread threads[NUM_MT_CODER_THREADS_MAX]; |
| } CMtCoder; |
| |
| void MtCoder_Construct(CMtCoder* p); |
| void MtCoder_Destruct(CMtCoder* p); |
| SRes MtCoder_Code(CMtCoder *p); |
| |
| EXTERN_C_END |
| |
| #endif |