xref: /aosp_15_r20/external/lzma/C/LzFindMt.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* LzFindMt.h -- multithreaded Match finder for LZ algorithms
2*f6dc9357SAndroid Build Coastguard Worker 2024-01-22 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZ_FIND_MT_H
5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZ_FIND_MT_H
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "LzFind.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "Threads.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker typedef struct
13*f6dc9357SAndroid Build Coastguard Worker {
14*f6dc9357SAndroid Build Coastguard Worker   UInt32 numProcessedBlocks;
15*f6dc9357SAndroid Build Coastguard Worker   CThread thread;
16*f6dc9357SAndroid Build Coastguard Worker   UInt64 affinity;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker   BoolInt wasCreated;
19*f6dc9357SAndroid Build Coastguard Worker   BoolInt needStart;
20*f6dc9357SAndroid Build Coastguard Worker   BoolInt csWasInitialized;
21*f6dc9357SAndroid Build Coastguard Worker   BoolInt csWasEntered;
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker   BoolInt exit;
24*f6dc9357SAndroid Build Coastguard Worker   BoolInt stopWriting;
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker   CAutoResetEvent canStart;
27*f6dc9357SAndroid Build Coastguard Worker   CAutoResetEvent wasStopped;
28*f6dc9357SAndroid Build Coastguard Worker   CSemaphore freeSemaphore;
29*f6dc9357SAndroid Build Coastguard Worker   CSemaphore filledSemaphore;
30*f6dc9357SAndroid Build Coastguard Worker   CCriticalSection cs;
31*f6dc9357SAndroid Build Coastguard Worker   // UInt32 numBlocks_Sent;
32*f6dc9357SAndroid Build Coastguard Worker } CMtSync;
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker struct CMatchFinderMt_;
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker typedef UInt32 * (*Mf_Mix_Matches)(struct CMatchFinderMt_ *p, UInt32 matchMinPos, UInt32 *distances);
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker /* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
40*f6dc9357SAndroid Build Coastguard Worker #define kMtCacheLineDummy 128
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
43*f6dc9357SAndroid Build Coastguard Worker   UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker typedef struct CMatchFinderMt_
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   /* LZ */
48*f6dc9357SAndroid Build Coastguard Worker   const Byte *pointerToCurPos;
49*f6dc9357SAndroid Build Coastguard Worker   UInt32 *btBuf;
50*f6dc9357SAndroid Build Coastguard Worker   const UInt32 *btBufPos;
51*f6dc9357SAndroid Build Coastguard Worker   const UInt32 *btBufPosLimit;
52*f6dc9357SAndroid Build Coastguard Worker   UInt32 lzPos;
53*f6dc9357SAndroid Build Coastguard Worker   UInt32 btNumAvailBytes;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   UInt32 *hash;
56*f6dc9357SAndroid Build Coastguard Worker   UInt32 fixedHashSize;
57*f6dc9357SAndroid Build Coastguard Worker   // UInt32 hash4Mask;
58*f6dc9357SAndroid Build Coastguard Worker   UInt32 historySize;
59*f6dc9357SAndroid Build Coastguard Worker   const UInt32 *crc;
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker   Mf_Mix_Matches MixMatchesFunc;
62*f6dc9357SAndroid Build Coastguard Worker   UInt32 failure_LZ_BT; // failure in BT transfered to LZ
63*f6dc9357SAndroid Build Coastguard Worker   // UInt32 failure_LZ_LZ; // failure in LZ tables
64*f6dc9357SAndroid Build Coastguard Worker   UInt32 failureBuf[1];
65*f6dc9357SAndroid Build Coastguard Worker   // UInt32 crc[256];
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   /* LZ + BT */
68*f6dc9357SAndroid Build Coastguard Worker   CMtSync btSync;
69*f6dc9357SAndroid Build Coastguard Worker   Byte btDummy[kMtCacheLineDummy];
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   /* BT */
72*f6dc9357SAndroid Build Coastguard Worker   UInt32 *hashBuf;
73*f6dc9357SAndroid Build Coastguard Worker   UInt32 hashBufPos;
74*f6dc9357SAndroid Build Coastguard Worker   UInt32 hashBufPosLimit;
75*f6dc9357SAndroid Build Coastguard Worker   UInt32 hashNumAvail;
76*f6dc9357SAndroid Build Coastguard Worker   UInt32 failure_BT;
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   CLzRef *son;
80*f6dc9357SAndroid Build Coastguard Worker   UInt32 matchMaxLen;
81*f6dc9357SAndroid Build Coastguard Worker   UInt32 numHashBytes;
82*f6dc9357SAndroid Build Coastguard Worker   UInt32 pos;
83*f6dc9357SAndroid Build Coastguard Worker   const Byte *buffer;
84*f6dc9357SAndroid Build Coastguard Worker   UInt32 cyclicBufferPos;
85*f6dc9357SAndroid Build Coastguard Worker   UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
86*f6dc9357SAndroid Build Coastguard Worker   UInt32 cutValue;
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker   /* BT + Hash */
89*f6dc9357SAndroid Build Coastguard Worker   CMtSync hashSync;
90*f6dc9357SAndroid Build Coastguard Worker   /* Byte hashDummy[kMtCacheLineDummy]; */
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker   /* Hash */
93*f6dc9357SAndroid Build Coastguard Worker   Mf_GetHeads GetHeadsFunc;
94*f6dc9357SAndroid Build Coastguard Worker   CMatchFinder *MatchFinder;
95*f6dc9357SAndroid Build Coastguard Worker   // CMatchFinder MatchFinder;
96*f6dc9357SAndroid Build Coastguard Worker } CMatchFinderMt;
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker // only for Mt part
99*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_Construct(CMatchFinderMt *p);
100*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc);
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
103*f6dc9357SAndroid Build Coastguard Worker     UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc);
104*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable);
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker /* call MatchFinderMt_InitMt() before IMatchFinder::Init() */
107*f6dc9357SAndroid Build Coastguard Worker SRes MatchFinderMt_InitMt(CMatchFinderMt *p);
108*f6dc9357SAndroid Build Coastguard Worker void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker #endif
113