1*f6dc9357SAndroid Build Coastguard Worker /* LzFindMt.h -- multithreaded Match finder for LZ algorithms 2*f6dc9357SAndroid Build Coastguard Worker 2024-01-22 : Igor Pavlov : Public domain */ 3*f6dc9357SAndroid Build Coastguard Worker 4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZ_FIND_MT_H 5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZ_FIND_MT_H 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #include "LzFind.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "Threads.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker typedef struct 13*f6dc9357SAndroid Build Coastguard Worker { 14*f6dc9357SAndroid Build Coastguard Worker UInt32 numProcessedBlocks; 15*f6dc9357SAndroid Build Coastguard Worker CThread thread; 16*f6dc9357SAndroid Build Coastguard Worker UInt64 affinity; 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker BoolInt wasCreated; 19*f6dc9357SAndroid Build Coastguard Worker BoolInt needStart; 20*f6dc9357SAndroid Build Coastguard Worker BoolInt csWasInitialized; 21*f6dc9357SAndroid Build Coastguard Worker BoolInt csWasEntered; 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker BoolInt exit; 24*f6dc9357SAndroid Build Coastguard Worker BoolInt stopWriting; 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent canStart; 27*f6dc9357SAndroid Build Coastguard Worker CAutoResetEvent wasStopped; 28*f6dc9357SAndroid Build Coastguard Worker CSemaphore freeSemaphore; 29*f6dc9357SAndroid Build Coastguard Worker CSemaphore filledSemaphore; 30*f6dc9357SAndroid Build Coastguard Worker CCriticalSection cs; 31*f6dc9357SAndroid Build Coastguard Worker // UInt32 numBlocks_Sent; 32*f6dc9357SAndroid Build Coastguard Worker } CMtSync; 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker 35*f6dc9357SAndroid Build Coastguard Worker struct CMatchFinderMt_; 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker typedef UInt32 * (*Mf_Mix_Matches)(struct CMatchFinderMt_ *p, UInt32 matchMinPos, UInt32 *distances); 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker /* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ 40*f6dc9357SAndroid Build Coastguard Worker #define kMtCacheLineDummy 128 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, 43*f6dc9357SAndroid Build Coastguard Worker UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker typedef struct CMatchFinderMt_ 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker /* LZ */ 48*f6dc9357SAndroid Build Coastguard Worker const Byte *pointerToCurPos; 49*f6dc9357SAndroid Build Coastguard Worker UInt32 *btBuf; 50*f6dc9357SAndroid Build Coastguard Worker const UInt32 *btBufPos; 51*f6dc9357SAndroid Build Coastguard Worker const UInt32 *btBufPosLimit; 52*f6dc9357SAndroid Build Coastguard Worker UInt32 lzPos; 53*f6dc9357SAndroid Build Coastguard Worker UInt32 btNumAvailBytes; 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker UInt32 *hash; 56*f6dc9357SAndroid Build Coastguard Worker UInt32 fixedHashSize; 57*f6dc9357SAndroid Build Coastguard Worker // UInt32 hash4Mask; 58*f6dc9357SAndroid Build Coastguard Worker UInt32 historySize; 59*f6dc9357SAndroid Build Coastguard Worker const UInt32 *crc; 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker Mf_Mix_Matches MixMatchesFunc; 62*f6dc9357SAndroid Build Coastguard Worker UInt32 failure_LZ_BT; // failure in BT transfered to LZ 63*f6dc9357SAndroid Build Coastguard Worker // UInt32 failure_LZ_LZ; // failure in LZ tables 64*f6dc9357SAndroid Build Coastguard Worker UInt32 failureBuf[1]; 65*f6dc9357SAndroid Build Coastguard Worker // UInt32 crc[256]; 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker /* LZ + BT */ 68*f6dc9357SAndroid Build Coastguard Worker CMtSync btSync; 69*f6dc9357SAndroid Build Coastguard Worker Byte btDummy[kMtCacheLineDummy]; 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker /* BT */ 72*f6dc9357SAndroid Build Coastguard Worker UInt32 *hashBuf; 73*f6dc9357SAndroid Build Coastguard Worker UInt32 hashBufPos; 74*f6dc9357SAndroid Build Coastguard Worker UInt32 hashBufPosLimit; 75*f6dc9357SAndroid Build Coastguard Worker UInt32 hashNumAvail; 76*f6dc9357SAndroid Build Coastguard Worker UInt32 failure_BT; 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker CLzRef *son; 80*f6dc9357SAndroid Build Coastguard Worker UInt32 matchMaxLen; 81*f6dc9357SAndroid Build Coastguard Worker UInt32 numHashBytes; 82*f6dc9357SAndroid Build Coastguard Worker UInt32 pos; 83*f6dc9357SAndroid Build Coastguard Worker const Byte *buffer; 84*f6dc9357SAndroid Build Coastguard Worker UInt32 cyclicBufferPos; 85*f6dc9357SAndroid Build Coastguard Worker UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ 86*f6dc9357SAndroid Build Coastguard Worker UInt32 cutValue; 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker /* BT + Hash */ 89*f6dc9357SAndroid Build Coastguard Worker CMtSync hashSync; 90*f6dc9357SAndroid Build Coastguard Worker /* Byte hashDummy[kMtCacheLineDummy]; */ 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker /* Hash */ 93*f6dc9357SAndroid Build Coastguard Worker Mf_GetHeads GetHeadsFunc; 94*f6dc9357SAndroid Build Coastguard Worker CMatchFinder *MatchFinder; 95*f6dc9357SAndroid Build Coastguard Worker // CMatchFinder MatchFinder; 96*f6dc9357SAndroid Build Coastguard Worker } CMatchFinderMt; 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker // only for Mt part 99*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_Construct(CMatchFinderMt *p); 100*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc); 101*f6dc9357SAndroid Build Coastguard Worker 102*f6dc9357SAndroid Build Coastguard Worker SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, 103*f6dc9357SAndroid Build Coastguard Worker UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc); 104*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable); 105*f6dc9357SAndroid Build Coastguard Worker 106*f6dc9357SAndroid Build Coastguard Worker /* call MatchFinderMt_InitMt() before IMatchFinder::Init() */ 107*f6dc9357SAndroid Build Coastguard Worker SRes MatchFinderMt_InitMt(CMatchFinderMt *p); 108*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END 111*f6dc9357SAndroid Build Coastguard Worker 112*f6dc9357SAndroid Build Coastguard Worker #endif 113