1*f6dc9357SAndroid Build Coastguard Worker /* MtCoder.h -- Multi-thread Coder 2*f6dc9357SAndroid Build Coastguard Worker 2023-04-13 : Igor Pavlov : Public domain */ 3*f6dc9357SAndroid Build Coastguard Worker 4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_MT_CODER_H 5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_MT_CODER_H 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #include "MtDec.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker /* 12*f6dc9357SAndroid Build Coastguard Worker if ( defined MTCODER_USE_WRITE_THREAD) : main thread writes all data blocks to output stream 13*f6dc9357SAndroid Build Coastguard Worker if (not defined MTCODER_USE_WRITE_THREAD) : any coder thread can write data blocks to output stream 14*f6dc9357SAndroid Build Coastguard Worker */ 15*f6dc9357SAndroid Build Coastguard Worker /* #define MTCODER_USE_WRITE_THREAD */ 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 18*f6dc9357SAndroid Build Coastguard Worker #define MTCODER_GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1) 19*f6dc9357SAndroid Build Coastguard Worker #define MTCODER_THREADS_MAX 64 20*f6dc9357SAndroid Build Coastguard Worker #define MTCODER_BLOCKS_MAX (MTCODER_GET_NUM_BLOCKS_FROM_THREADS(MTCODER_THREADS_MAX) + 3) 21*f6dc9357SAndroid Build Coastguard Worker #else 22*f6dc9357SAndroid Build Coastguard Worker #define MTCODER_THREADS_MAX 1 23*f6dc9357SAndroid Build Coastguard Worker #define MTCODER_BLOCKS_MAX 1 24*f6dc9357SAndroid Build Coastguard Worker #endif 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker typedef struct 31*f6dc9357SAndroid Build Coastguard Worker { 32*f6dc9357SAndroid Build Coastguard Worker ICompressProgress vt; 33*f6dc9357SAndroid Build Coastguard Worker CMtProgress *mtProgress; 34*f6dc9357SAndroid Build Coastguard Worker UInt64 inSize; 35*f6dc9357SAndroid Build Coastguard Worker UInt64 outSize; 36*f6dc9357SAndroid Build Coastguard Worker } CMtProgressThunk; 37*f6dc9357SAndroid Build Coastguard Worker 38*f6dc9357SAndroid Build Coastguard Worker void MtProgressThunk_CreateVTable(CMtProgressThunk *p); 39*f6dc9357SAndroid Build Coastguard Worker 40*f6dc9357SAndroid Build Coastguard Worker #define MtProgressThunk_INIT(p) { (p)->inSize = 0; (p)->outSize = 0; } 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker struct CMtCoder_; 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker typedef struct 47*f6dc9357SAndroid Build Coastguard Worker { 48*f6dc9357SAndroid Build Coastguard Worker struct CMtCoder_ *mtCoder; 49*f6dc9357SAndroid Build Coastguard Worker unsigned index; 50*f6dc9357SAndroid Build Coastguard Worker int stop; 51*f6dc9357SAndroid Build Coastguard Worker Byte *inBuf; 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent startEvent; 54*f6dc9357SAndroid Build Coastguard Worker CThread thread; 55*f6dc9357SAndroid Build Coastguard Worker } CMtCoderThread; 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker typedef struct 59*f6dc9357SAndroid Build Coastguard Worker { 60*f6dc9357SAndroid Build Coastguard Worker SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex, 61*f6dc9357SAndroid Build Coastguard Worker const Byte *src, size_t srcSize, int finished); 62*f6dc9357SAndroid Build Coastguard Worker SRes (*Write)(void *p, unsigned outBufIndex); 63*f6dc9357SAndroid Build Coastguard Worker } IMtCoderCallback2; 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker typedef struct 67*f6dc9357SAndroid Build Coastguard Worker { 68*f6dc9357SAndroid Build Coastguard Worker SRes res; 69*f6dc9357SAndroid Build Coastguard Worker unsigned bufIndex; 70*f6dc9357SAndroid Build Coastguard Worker BoolInt finished; 71*f6dc9357SAndroid Build Coastguard Worker } CMtCoderBlock; 72*f6dc9357SAndroid Build Coastguard Worker 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker typedef struct CMtCoder_ 75*f6dc9357SAndroid Build Coastguard Worker { 76*f6dc9357SAndroid Build Coastguard Worker /* input variables */ 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker size_t blockSize; /* size of input block */ 79*f6dc9357SAndroid Build Coastguard Worker unsigned numThreadsMax; 80*f6dc9357SAndroid Build Coastguard Worker UInt64 expectedDataSize; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker ISeqInStreamPtr inStream; 83*f6dc9357SAndroid Build Coastguard Worker const Byte *inData; 84*f6dc9357SAndroid Build Coastguard Worker size_t inDataSize; 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker ICompressProgressPtr progress; 87*f6dc9357SAndroid Build Coastguard Worker ISzAllocPtr allocBig; 88*f6dc9357SAndroid Build Coastguard Worker 89*f6dc9357SAndroid Build Coastguard Worker IMtCoderCallback2 *mtCallback; 90*f6dc9357SAndroid Build Coastguard Worker void *mtCallbackObject; 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker /* internal variables */ 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker size_t allocatedBufsSize; 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent readEvent; 98*f6dc9357SAndroid Build Coastguard Worker CSemaphore blocksSemaphore; 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker BoolInt stopReading; 101*f6dc9357SAndroid Build Coastguard Worker SRes readRes; 102*f6dc9357SAndroid Build Coastguard Worker 103*f6dc9357SAndroid Build Coastguard Worker #ifdef MTCODER_USE_WRITE_THREAD 104*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent writeEvents[MTCODER_BLOCKS_MAX]; 105*f6dc9357SAndroid Build Coastguard Worker #else 106*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent finishedEvent; 107*f6dc9357SAndroid Build Coastguard Worker SRes writeRes; 108*f6dc9357SAndroid Build Coastguard Worker unsigned writeIndex; 109*f6dc9357SAndroid Build Coastguard Worker Byte ReadyBlocks[MTCODER_BLOCKS_MAX]; 110*f6dc9357SAndroid Build Coastguard Worker LONG numFinishedThreads; 111*f6dc9357SAndroid Build Coastguard Worker #endif 112*f6dc9357SAndroid Build Coastguard Worker 113*f6dc9357SAndroid Build Coastguard Worker unsigned numStartedThreadsLimit; 114*f6dc9357SAndroid Build Coastguard Worker unsigned numStartedThreads; 115*f6dc9357SAndroid Build Coastguard Worker 116*f6dc9357SAndroid Build Coastguard Worker unsigned numBlocksMax; 117*f6dc9357SAndroid Build Coastguard Worker unsigned blockIndex; 118*f6dc9357SAndroid Build Coastguard Worker UInt64 readProcessed; 119*f6dc9357SAndroid Build Coastguard Worker 120*f6dc9357SAndroid Build Coastguard Worker CCriticalSection cs; 121*f6dc9357SAndroid Build Coastguard Worker 122*f6dc9357SAndroid Build Coastguard Worker unsigned freeBlockHead; 123*f6dc9357SAndroid Build Coastguard Worker unsigned freeBlockList[MTCODER_BLOCKS_MAX]; 124*f6dc9357SAndroid Build Coastguard Worker 125*f6dc9357SAndroid Build Coastguard Worker CMtProgress mtProgress; 126*f6dc9357SAndroid Build Coastguard Worker CMtCoderBlock blocks[MTCODER_BLOCKS_MAX]; 127*f6dc9357SAndroid Build Coastguard Worker CMtCoderThread threads[MTCODER_THREADS_MAX]; 128*f6dc9357SAndroid Build Coastguard Worker } CMtCoder; 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker 131*f6dc9357SAndroid Build Coastguard Worker void MtCoder_Construct(CMtCoder *p); 132*f6dc9357SAndroid Build Coastguard Worker void MtCoder_Destruct(CMtCoder *p); 133*f6dc9357SAndroid Build Coastguard Worker SRes MtCoder_Code(CMtCoder *p); 134*f6dc9357SAndroid Build Coastguard Worker 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker #endif 137*f6dc9357SAndroid Build Coastguard Worker 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END 140*f6dc9357SAndroid Build Coastguard Worker 141*f6dc9357SAndroid Build Coastguard Worker #endif 142