]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/LzmaCompress/Sdk/C/LzFindMt.h
46b6924ad72e2263bebe6794a70e18b3287a480a
[mirror_edk2.git] / BaseTools / Source / C / LzmaCompress / Sdk / C / LzFindMt.h
1 /* LzFindMt.h -- multithreaded Match finder for LZ algorithms
2 2015-05-03 : 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 EXTERN_C_BEGIN
11
12 #define kMtHashBlockSize (1 << 13)
13 #define kMtHashNumBlocks (1 << 3)
14 #define kMtHashNumBlocksMask (kMtHashNumBlocks - 1)
15
16 #define kMtBtBlockSize (1 << 14)
17 #define kMtBtNumBlocks (1 << 6)
18 #define kMtBtNumBlocksMask (kMtBtNumBlocks - 1)
19
20 typedef struct _CMtSync
21 {
22 Bool wasCreated;
23 Bool needStart;
24 Bool exit;
25 Bool stopWriting;
26
27 CThread thread;
28 CAutoResetEvent canStart;
29 CAutoResetEvent wasStarted;
30 CAutoResetEvent wasStopped;
31 CSemaphore freeSemaphore;
32 CSemaphore filledSemaphore;
33 Bool csWasInitialized;
34 Bool csWasEntered;
35 CCriticalSection cs;
36 UInt32 numProcessedBlocks;
37 } CMtSync;
38
39 typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);
40
41 /* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
42 #define kMtCacheLineDummy 128
43
44 typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
45 UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
46
47 typedef struct _CMatchFinderMt
48 {
49 /* LZ */
50 const Byte *pointerToCurPos;
51 UInt32 *btBuf;
52 UInt32 btBufPos;
53 UInt32 btBufPosLimit;
54 UInt32 lzPos;
55 UInt32 btNumAvailBytes;
56
57 UInt32 *hash;
58 UInt32 fixedHashSize;
59 UInt32 historySize;
60 const UInt32 *crc;
61
62 Mf_Mix_Matches MixMatchesFunc;
63
64 /* LZ + BT */
65 CMtSync btSync;
66 Byte btDummy[kMtCacheLineDummy];
67
68 /* BT */
69 UInt32 *hashBuf;
70 UInt32 hashBufPos;
71 UInt32 hashBufPosLimit;
72 UInt32 hashNumAvail;
73
74 CLzRef *son;
75 UInt32 matchMaxLen;
76 UInt32 numHashBytes;
77 UInt32 pos;
78 const Byte *buffer;
79 UInt32 cyclicBufferPos;
80 UInt32 cyclicBufferSize; /* it must be historySize + 1 */
81 UInt32 cutValue;
82
83 /* BT + Hash */
84 CMtSync hashSync;
85 /* Byte hashDummy[kMtCacheLineDummy]; */
86
87 /* Hash */
88 Mf_GetHeads GetHeadsFunc;
89 CMatchFinder *MatchFinder;
90 } CMatchFinderMt;
91
92 void MatchFinderMt_Construct(CMatchFinderMt *p);
93 void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc);
94 SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
95 UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc);
96 void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable);
97 void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
98
99 EXTERN_C_END
100
101 #endif