xref: /aosp_15_r20/external/lzma/C/MtCoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* MtCoder.h -- Multi-thread Coder
2*f6dc9357SAndroid Build Coastguard Worker 2023-04-13 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_MT_CODER_H
5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_MT_CODER_H
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "MtDec.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker /*
12*f6dc9357SAndroid Build Coastguard Worker   if (    defined MTCODER_USE_WRITE_THREAD) : main thread writes all data blocks to output stream
13*f6dc9357SAndroid Build Coastguard Worker   if (not defined MTCODER_USE_WRITE_THREAD) : any coder thread can write data blocks to output stream
14*f6dc9357SAndroid Build Coastguard Worker */
15*f6dc9357SAndroid Build Coastguard Worker /* #define MTCODER_USE_WRITE_THREAD */
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
18*f6dc9357SAndroid Build Coastguard Worker   #define MTCODER_GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1)
19*f6dc9357SAndroid Build Coastguard Worker   #define MTCODER_THREADS_MAX 64
20*f6dc9357SAndroid Build Coastguard Worker   #define MTCODER_BLOCKS_MAX (MTCODER_GET_NUM_BLOCKS_FROM_THREADS(MTCODER_THREADS_MAX) + 3)
21*f6dc9357SAndroid Build Coastguard Worker #else
22*f6dc9357SAndroid Build Coastguard Worker   #define MTCODER_THREADS_MAX 1
23*f6dc9357SAndroid Build Coastguard Worker   #define MTCODER_BLOCKS_MAX 1
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker typedef struct
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   ICompressProgress vt;
33*f6dc9357SAndroid Build Coastguard Worker   CMtProgress *mtProgress;
34*f6dc9357SAndroid Build Coastguard Worker   UInt64 inSize;
35*f6dc9357SAndroid Build Coastguard Worker   UInt64 outSize;
36*f6dc9357SAndroid Build Coastguard Worker } CMtProgressThunk;
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker void MtProgressThunk_CreateVTable(CMtProgressThunk *p);
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker #define MtProgressThunk_INIT(p) { (p)->inSize = 0; (p)->outSize = 0; }
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker struct CMtCoder_;
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker typedef struct
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker   struct CMtCoder_ *mtCoder;
49*f6dc9357SAndroid Build Coastguard Worker   unsigned index;
50*f6dc9357SAndroid Build Coastguard Worker   int stop;
51*f6dc9357SAndroid Build Coastguard Worker   Byte *inBuf;
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker   CAutoResetEvent startEvent;
54*f6dc9357SAndroid Build Coastguard Worker   CThread thread;
55*f6dc9357SAndroid Build Coastguard Worker } CMtCoderThread;
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker typedef struct
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex,
61*f6dc9357SAndroid Build Coastguard Worker       const Byte *src, size_t srcSize, int finished);
62*f6dc9357SAndroid Build Coastguard Worker   SRes (*Write)(void *p, unsigned outBufIndex);
63*f6dc9357SAndroid Build Coastguard Worker } IMtCoderCallback2;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker typedef struct
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker   SRes res;
69*f6dc9357SAndroid Build Coastguard Worker   unsigned bufIndex;
70*f6dc9357SAndroid Build Coastguard Worker   BoolInt finished;
71*f6dc9357SAndroid Build Coastguard Worker } CMtCoderBlock;
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker typedef struct CMtCoder_
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   /* input variables */
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker   size_t blockSize;        /* size of input block */
79*f6dc9357SAndroid Build Coastguard Worker   unsigned numThreadsMax;
80*f6dc9357SAndroid Build Coastguard Worker   UInt64 expectedDataSize;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   ISeqInStreamPtr inStream;
83*f6dc9357SAndroid Build Coastguard Worker   const Byte *inData;
84*f6dc9357SAndroid Build Coastguard Worker   size_t inDataSize;
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker   ICompressProgressPtr progress;
87*f6dc9357SAndroid Build Coastguard Worker   ISzAllocPtr allocBig;
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   IMtCoderCallback2 *mtCallback;
90*f6dc9357SAndroid Build Coastguard Worker   void *mtCallbackObject;
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker   /* internal variables */
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   size_t allocatedBufsSize;
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker   CAutoResetEvent readEvent;
98*f6dc9357SAndroid Build Coastguard Worker   CSemaphore blocksSemaphore;
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   BoolInt stopReading;
101*f6dc9357SAndroid Build Coastguard Worker   SRes readRes;
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker   #ifdef MTCODER_USE_WRITE_THREAD
104*f6dc9357SAndroid Build Coastguard Worker     CAutoResetEvent writeEvents[MTCODER_BLOCKS_MAX];
105*f6dc9357SAndroid Build Coastguard Worker   #else
106*f6dc9357SAndroid Build Coastguard Worker     CAutoResetEvent finishedEvent;
107*f6dc9357SAndroid Build Coastguard Worker     SRes writeRes;
108*f6dc9357SAndroid Build Coastguard Worker     unsigned writeIndex;
109*f6dc9357SAndroid Build Coastguard Worker     Byte ReadyBlocks[MTCODER_BLOCKS_MAX];
110*f6dc9357SAndroid Build Coastguard Worker     LONG numFinishedThreads;
111*f6dc9357SAndroid Build Coastguard Worker   #endif
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   unsigned numStartedThreadsLimit;
114*f6dc9357SAndroid Build Coastguard Worker   unsigned numStartedThreads;
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker   unsigned numBlocksMax;
117*f6dc9357SAndroid Build Coastguard Worker   unsigned blockIndex;
118*f6dc9357SAndroid Build Coastguard Worker   UInt64 readProcessed;
119*f6dc9357SAndroid Build Coastguard Worker 
120*f6dc9357SAndroid Build Coastguard Worker   CCriticalSection cs;
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker   unsigned freeBlockHead;
123*f6dc9357SAndroid Build Coastguard Worker   unsigned freeBlockList[MTCODER_BLOCKS_MAX];
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker   CMtProgress mtProgress;
126*f6dc9357SAndroid Build Coastguard Worker   CMtCoderBlock blocks[MTCODER_BLOCKS_MAX];
127*f6dc9357SAndroid Build Coastguard Worker   CMtCoderThread threads[MTCODER_THREADS_MAX];
128*f6dc9357SAndroid Build Coastguard Worker } CMtCoder;
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker void MtCoder_Construct(CMtCoder *p);
132*f6dc9357SAndroid Build Coastguard Worker void MtCoder_Destruct(CMtCoder *p);
133*f6dc9357SAndroid Build Coastguard Worker SRes MtCoder_Code(CMtCoder *p);
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker #endif
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker #endif
142