1 /* MtCoder.h -- Multi-thread Coder
\r
2 2018-07-04 : Igor Pavlov : Public domain */
\r
12 if ( defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream
\r
13 if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream
\r
15 /* #define MTCODER__USE_WRITE_THREAD */
\r
18 #define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1)
\r
19 #define MTCODER__THREADS_MAX 64
\r
20 #define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3)
\r
22 #define MTCODER__THREADS_MAX 1
\r
23 #define MTCODER__BLOCKS_MAX 1
\r
32 ICompressProgress vt;
\r
33 CMtProgress *mtProgress;
\r
38 void MtProgressThunk_CreateVTable(CMtProgressThunk *p);
\r
40 #define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; }
\r
48 struct _CMtCoder *mtCoder;
\r
53 CAutoResetEvent startEvent;
\r
60 SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex,
\r
61 const Byte *src, size_t srcSize, int finished);
\r
62 SRes (*Write)(void *p, unsigned outBufIndex);
\r
63 } IMtCoderCallback2;
\r
74 typedef struct _CMtCoder
\r
76 /* input variables */
\r
78 size_t blockSize; /* size of input block */
\r
79 unsigned numThreadsMax;
\r
80 UInt64 expectedDataSize;
\r
82 ISeqInStream *inStream;
\r
86 ICompressProgress *progress;
\r
87 ISzAllocPtr allocBig;
\r
89 IMtCoderCallback2 *mtCallback;
\r
90 void *mtCallbackObject;
\r
93 /* internal variables */
\r
95 size_t allocatedBufsSize;
\r
97 CAutoResetEvent readEvent;
\r
98 CSemaphore blocksSemaphore;
\r
100 BoolInt stopReading;
\r
103 #ifdef MTCODER__USE_WRITE_THREAD
\r
104 CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX];
\r
106 CAutoResetEvent finishedEvent;
\r
108 unsigned writeIndex;
\r
109 Byte ReadyBlocks[MTCODER__BLOCKS_MAX];
\r
110 LONG numFinishedThreads;
\r
113 unsigned numStartedThreadsLimit;
\r
114 unsigned numStartedThreads;
\r
116 unsigned numBlocksMax;
\r
117 unsigned blockIndex;
\r
118 UInt64 readProcessed;
\r
120 CCriticalSection cs;
\r
122 unsigned freeBlockHead;
\r
123 unsigned freeBlockList[MTCODER__BLOCKS_MAX];
\r
125 CMtProgress mtProgress;
\r
126 CMtCoderBlock blocks[MTCODER__BLOCKS_MAX];
\r
127 CMtCoderThread threads[MTCODER__THREADS_MAX];
\r
131 void MtCoder_Construct(CMtCoder *p);
\r
132 void MtCoder_Destruct(CMtCoder *p);
\r
133 SRes MtCoder_Code(CMtCoder *p);
\r