You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.3 KiB
101 lines
2.3 KiB
/* LzFindMt.h -- multithreaded Match finder for LZ algorithms |
|
2013-01-18 : Igor Pavlov : Public domain */ |
|
|
|
#ifndef __LZ_FIND_MT_H |
|
#define __LZ_FIND_MT_H |
|
|
|
#include "LzFind.h" |
|
#include "Threads.h" |
|
|
|
EXTERN_C_BEGIN |
|
|
|
#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); |
|
|
|
EXTERN_C_END |
|
|
|
#endif
|
|
|