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