repo sync | baa3858 | 2013-07-26 17:53:31 -0700 | [diff] [blame] | 1 | /* MtCoder.h -- Multi-thread Coder
|
| 2 | 2009-11-19 : Igor Pavlov : Public domain */
|
| 3 |
|
| 4 | #ifndef __MT_CODER_H
|
| 5 | #define __MT_CODER_H
|
| 6 |
|
| 7 | #include "Threads.h"
|
| 8 |
|
| 9 | EXTERN_C_BEGIN
|
| 10 |
|
| 11 | typedef struct
|
| 12 | {
|
| 13 | CThread thread;
|
| 14 | CAutoResetEvent startEvent;
|
| 15 | CAutoResetEvent finishedEvent;
|
| 16 | int stop;
|
| 17 |
|
| 18 | THREAD_FUNC_TYPE func;
|
| 19 | LPVOID param;
|
| 20 | THREAD_FUNC_RET_TYPE res;
|
| 21 | } CLoopThread;
|
| 22 |
|
| 23 | void LoopThread_Construct(CLoopThread *p);
|
| 24 | void LoopThread_Close(CLoopThread *p);
|
| 25 | WRes LoopThread_Create(CLoopThread *p);
|
| 26 | WRes LoopThread_StopAndWait(CLoopThread *p);
|
| 27 | WRes LoopThread_StartSubThread(CLoopThread *p);
|
| 28 | WRes LoopThread_WaitSubThread(CLoopThread *p);
|
| 29 |
|
| 30 | #ifndef _7ZIP_ST
|
| 31 | #define NUM_MT_CODER_THREADS_MAX 32
|
| 32 | #else
|
| 33 | #define NUM_MT_CODER_THREADS_MAX 1
|
| 34 | #endif
|
| 35 |
|
| 36 | typedef struct
|
| 37 | {
|
| 38 | UInt64 totalInSize;
|
| 39 | UInt64 totalOutSize;
|
| 40 | ICompressProgress *progress;
|
| 41 | SRes res;
|
| 42 | CCriticalSection cs;
|
| 43 | UInt64 inSizes[NUM_MT_CODER_THREADS_MAX];
|
| 44 | UInt64 outSizes[NUM_MT_CODER_THREADS_MAX];
|
| 45 | } CMtProgress;
|
| 46 |
|
| 47 | SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize);
|
| 48 |
|
| 49 | struct _CMtCoder;
|
| 50 |
|
| 51 | typedef struct
|
| 52 | {
|
| 53 | struct _CMtCoder *mtCoder;
|
| 54 | Byte *outBuf;
|
| 55 | size_t outBufSize;
|
| 56 | Byte *inBuf;
|
| 57 | size_t inBufSize;
|
| 58 | unsigned index;
|
| 59 | CLoopThread thread;
|
| 60 |
|
| 61 | Bool stopReading;
|
| 62 | Bool stopWriting;
|
| 63 | CAutoResetEvent canRead;
|
| 64 | CAutoResetEvent canWrite;
|
| 65 | } CMtThread;
|
| 66 |
|
| 67 | typedef struct
|
| 68 | {
|
| 69 | SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize,
|
| 70 | const Byte *src, size_t srcSize, int finished);
|
| 71 | } IMtCoderCallback;
|
| 72 |
|
| 73 | typedef struct _CMtCoder
|
| 74 | {
|
| 75 | size_t blockSize;
|
| 76 | size_t destBlockSize;
|
| 77 | unsigned numThreads;
|
| 78 |
|
| 79 | ISeqInStream *inStream;
|
| 80 | ISeqOutStream *outStream;
|
| 81 | ICompressProgress *progress;
|
| 82 | ISzAlloc *alloc;
|
| 83 |
|
| 84 | IMtCoderCallback *mtCallback;
|
| 85 | CCriticalSection cs;
|
| 86 | SRes res;
|
| 87 |
|
| 88 | CMtProgress mtProgress;
|
| 89 | CMtThread threads[NUM_MT_CODER_THREADS_MAX];
|
| 90 | } CMtCoder;
|
| 91 |
|
| 92 | void MtCoder_Construct(CMtCoder* p);
|
| 93 | void MtCoder_Destruct(CMtCoder* p);
|
| 94 | SRes MtCoder_Code(CMtCoder *p);
|
| 95 |
|
| 96 | EXTERN_C_END
|
| 97 |
|
| 98 | #endif
|