1 /* LzFindMt.h -- multithreaded Match finder for LZ algorithms 2 2009-02-07 : Igor Pavlov : Public domain */ 3 4 #ifndef __LZ_FIND_MT_H 5 #define __LZ_FIND_MT_H 6 7 #include "LzFind.h" 8 #include "Threads.h" 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 #define kMtHashBlockSize (1 << 13) 15 #define kMtHashNumBlocks (1 << 3) 16 #define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) 17 18 #define kMtBtBlockSize (1 << 14) 19 #define kMtBtNumBlocks (1 << 6) 20 #define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) 21 22 typedef struct _CMtSync 23 { 24 Bool wasCreated; 25 Bool needStart; 26 Bool exit; 27 Bool stopWriting; 28 29 CThread thread; 30 CAutoResetEvent canStart; 31 CAutoResetEvent wasStarted; 32 CAutoResetEvent wasStopped; 33 CSemaphore freeSemaphore; 34 CSemaphore filledSemaphore; 35 Bool csWasInitialized; 36 Bool csWasEntered; 37 CCriticalSection cs; 38 UInt32 numProcessedBlocks; 39 } CMtSync; 40 41 typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); 42 43 /* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ 44 #define kMtCacheLineDummy 128 45 46 typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, 47 UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); 48 49 typedef struct _CMatchFinderMt 50 { 51 /* LZ */ 52 const Byte *pointerToCurPos; 53 UInt32 *btBuf; 54 UInt32 btBufPos; 55 UInt32 btBufPosLimit; 56 UInt32 lzPos; 57 UInt32 btNumAvailBytes; 58 59 UInt32 *hash; 60 UInt32 fixedHashSize; 61 UInt32 historySize; 62 const UInt32 *crc; 63 64 Mf_Mix_Matches MixMatchesFunc; 65 66 /* LZ + BT */ 67 CMtSync btSync; 68 Byte btDummy[kMtCacheLineDummy]; 69 70 /* BT */ 71 UInt32 *hashBuf; 72 UInt32 hashBufPos; 73 UInt32 hashBufPosLimit; 74 UInt32 hashNumAvail; 75 76 CLzRef *son; 77 UInt32 matchMaxLen; 78 UInt32 numHashBytes; 79 UInt32 pos; 80 Byte *buffer; 81 UInt32 cyclicBufferPos; 82 UInt32 cyclicBufferSize; /* it must be historySize + 1 */ 83 UInt32 cutValue; 84 85 /* BT + Hash */ 86 CMtSync hashSync; 87 /* Byte hashDummy[kMtCacheLineDummy]; */ 88 89 /* Hash */ 90 Mf_GetHeads GetHeadsFunc; 91 CMatchFinder *MatchFinder; 92 } CMatchFinderMt; 93 94 void MatchFinderMt_Construct(CMatchFinderMt *p); 95 void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); 96 SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, 97 UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); 98 void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); 99 void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); 100 101 #ifdef __cplusplus 102 } 103 #endif 104 105 #endif 106