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