LzFindMt.h revision baa3858d3f5d128a5c8466b700098109edcad5f2
1/* LzFindMt.h -- multithreaded Match finder for LZ algorithms 22009-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 11extern "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 22typedef 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 41typedef 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 46typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, 47 UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); 48 49typedef 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 94void MatchFinderMt_Construct(CMatchFinderMt *p); 95void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); 96SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, 97 UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); 98void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); 99void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); 100 101#ifdef __cplusplus 102} 103#endif 104 105#endif 106