blob: 17ed237d64b15f08ae0ee15e47ed03ac9c56e60d [file] [log] [blame]
repo syncbaa38582013-07-26 17:53:31 -07001/* 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