/* LzFindMt.h -- multithreaded Match finder for LZ algorithms | |
2009-02-07 : Igor Pavlov : Public domain */ | |
#ifndef __LZ_FIND_MT_H | |
#define __LZ_FIND_MT_H | |
#include "LzFind.h" | |
#include "Threads.h" | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
#define kMtHashBlockSize (1 << 13) | |
#define kMtHashNumBlocks (1 << 3) | |
#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) | |
#define kMtBtBlockSize (1 << 14) | |
#define kMtBtNumBlocks (1 << 6) | |
#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) | |
typedef struct _CMtSync | |
{ | |
Bool wasCreated; | |
Bool needStart; | |
Bool exit; | |
Bool stopWriting; | |
CThread thread; | |
CAutoResetEvent canStart; | |
CAutoResetEvent wasStarted; | |
CAutoResetEvent wasStopped; | |
CSemaphore freeSemaphore; | |
CSemaphore filledSemaphore; | |
Bool csWasInitialized; | |
Bool csWasEntered; | |
CCriticalSection cs; | |
UInt32 numProcessedBlocks; | |
} CMtSync; | |
typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); | |
/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ | |
#define kMtCacheLineDummy 128 | |
typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, | |
UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); | |
typedef struct _CMatchFinderMt | |
{ | |
/* LZ */ | |
const Byte *pointerToCurPos; | |
UInt32 *btBuf; | |
UInt32 btBufPos; | |
UInt32 btBufPosLimit; | |
UInt32 lzPos; | |
UInt32 btNumAvailBytes; | |
UInt32 *hash; | |
UInt32 fixedHashSize; | |
UInt32 historySize; | |
const UInt32 *crc; | |
Mf_Mix_Matches MixMatchesFunc; | |
/* LZ + BT */ | |
CMtSync btSync; | |
Byte btDummy[kMtCacheLineDummy]; | |
/* BT */ | |
UInt32 *hashBuf; | |
UInt32 hashBufPos; | |
UInt32 hashBufPosLimit; | |
UInt32 hashNumAvail; | |
CLzRef *son; | |
UInt32 matchMaxLen; | |
UInt32 numHashBytes; | |
UInt32 pos; | |
Byte *buffer; | |
UInt32 cyclicBufferPos; | |
UInt32 cyclicBufferSize; /* it must be historySize + 1 */ | |
UInt32 cutValue; | |
/* BT + Hash */ | |
CMtSync hashSync; | |
/* Byte hashDummy[kMtCacheLineDummy]; */ | |
/* Hash */ | |
Mf_GetHeads GetHeadsFunc; | |
CMatchFinder *MatchFinder; | |
} CMatchFinderMt; | |
void MatchFinderMt_Construct(CMatchFinderMt *p); | |
void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); | |
SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, | |
UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); | |
void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); | |
void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif |