update libchdr
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / include / MtDec.h
CommitLineData
9e052883 1/* MtDec.h -- Multi-thread Decoder\r
22020-03-05 : Igor Pavlov : Public domain */\r
3\r
4#ifndef __MT_DEC_H\r
5#define __MT_DEC_H\r
6\r
7#include "7zTypes.h"\r
8\r
9#ifndef _7ZIP_ST\r
10#include "Threads.h"\r
11#endif\r
12\r
13EXTERN_C_BEGIN\r
14\r
15#ifndef _7ZIP_ST\r
16\r
17#ifndef _7ZIP_ST\r
18 #define MTDEC__THREADS_MAX 32\r
19#else\r
20 #define MTDEC__THREADS_MAX 1\r
21#endif\r
22\r
23\r
24typedef struct\r
25{\r
26 ICompressProgress *progress;\r
27 SRes res;\r
28 UInt64 totalInSize;\r
29 UInt64 totalOutSize;\r
30 CCriticalSection cs;\r
31} CMtProgress;\r
32\r
33void MtProgress_Init(CMtProgress *p, ICompressProgress *progress);\r
34SRes MtProgress_Progress_ST(CMtProgress *p);\r
35SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize);\r
36SRes MtProgress_GetError(CMtProgress *p);\r
37void MtProgress_SetError(CMtProgress *p, SRes res);\r
38\r
39struct _CMtDec;\r
40\r
41typedef struct\r
42{\r
43 struct _CMtDec *mtDec;\r
44 unsigned index;\r
45 void *inBuf;\r
46\r
47 size_t inDataSize_Start; // size of input data in start block\r
48 UInt64 inDataSize; // total size of input data in all blocks\r
49\r
50 CThread thread;\r
51 CAutoResetEvent canRead;\r
52 CAutoResetEvent canWrite;\r
53 void *allocaPtr;\r
54} CMtDecThread;\r
55\r
56void MtDecThread_FreeInBufs(CMtDecThread *t);\r
57\r
58\r
59typedef enum\r
60{\r
61 MTDEC_PARSE_CONTINUE, // continue this block with more input data\r
62 MTDEC_PARSE_OVERFLOW, // MT buffers overflow, need switch to single-thread\r
63 MTDEC_PARSE_NEW, // new block\r
64 MTDEC_PARSE_END // end of block threading. But we still can return to threading after Write(&needContinue)\r
65} EMtDecParseState;\r
66\r
67typedef struct\r
68{\r
69 // in\r
70 int startCall;\r
71 const Byte *src;\r
72 size_t srcSize;\r
73 // in : (srcSize == 0) is allowed\r
74 // out : it's allowed to return less that actually was used ?\r
75 int srcFinished;\r
76\r
77 // out\r
78 EMtDecParseState state;\r
79 BoolInt canCreateNewThread;\r
80 UInt64 outPos; // check it (size_t)\r
81} CMtDecCallbackInfo;\r
82\r
83\r
84typedef struct\r
85{\r
86 void (*Parse)(void *p, unsigned coderIndex, CMtDecCallbackInfo *ci);\r
87 \r
88 // PreCode() and Code():\r
89 // (SRes_return_result != SZ_OK) means stop decoding, no need another blocks\r
90 SRes (*PreCode)(void *p, unsigned coderIndex);\r
91 SRes (*Code)(void *p, unsigned coderIndex,\r
92 const Byte *src, size_t srcSize, int srcFinished,\r
93 UInt64 *inCodePos, UInt64 *outCodePos, int *stop);\r
94 // stop - means stop another Code calls\r
95\r
96\r
97 /* Write() must be called, if Parse() was called\r
98 set (needWrite) if\r
99 {\r
100 && (was not interrupted by progress)\r
101 && (was not interrupted in previous block)\r
102 }\r
103\r
104 out:\r
105 if (*needContinue), decoder still need to continue decoding with new iteration,\r
106 even after MTDEC_PARSE_END\r
107 if (*canRecode), we didn't flush current block data, so we still can decode current block later.\r
108 */\r
109 SRes (*Write)(void *p, unsigned coderIndex,\r
110 BoolInt needWriteToStream,\r
111 const Byte *src, size_t srcSize, BoolInt isCross,\r
112 // int srcFinished,\r
113 BoolInt *needContinue,\r
114 BoolInt *canRecode);\r
115\r
116} IMtDecCallback2;\r
117\r
118\r
119\r
120typedef struct _CMtDec\r
121{\r
122 /* input variables */\r
123 \r
124 size_t inBufSize; /* size of input block */\r
125 unsigned numThreadsMax;\r
126 // size_t inBlockMax;\r
127 unsigned numThreadsMax_2;\r
128\r
129 ISeqInStream *inStream;\r
130 // const Byte *inData;\r
131 // size_t inDataSize;\r
132\r
133 ICompressProgress *progress;\r
134 ISzAllocPtr alloc;\r
135\r
136 IMtDecCallback2 *mtCallback;\r
137 void *mtCallbackObject;\r
138\r
139 \r
140 /* internal variables */\r
141 \r
142 size_t allocatedBufsSize;\r
143\r
144 BoolInt exitThread;\r
145 WRes exitThreadWRes;\r
146\r
147 UInt64 blockIndex;\r
148 BoolInt isAllocError;\r
149 BoolInt overflow;\r
150 SRes threadingErrorSRes;\r
151\r
152 BoolInt needContinue;\r
153\r
154 // CAutoResetEvent finishedEvent;\r
155\r
156 SRes readRes;\r
157 SRes codeRes;\r
158\r
159 BoolInt wasInterrupted;\r
160\r
161 unsigned numStartedThreads_Limit;\r
162 unsigned numStartedThreads;\r
163\r
164 Byte *crossBlock;\r
165 size_t crossStart;\r
166 size_t crossEnd;\r
167 UInt64 readProcessed;\r
168 BoolInt readWasFinished;\r
169 UInt64 inProcessed;\r
170\r
171 unsigned filledThreadStart;\r
172 unsigned numFilledThreads;\r
173\r
174 #ifndef _7ZIP_ST\r
175 BoolInt needInterrupt;\r
176 UInt64 interruptIndex;\r
177 CMtProgress mtProgress;\r
178 CMtDecThread threads[MTDEC__THREADS_MAX];\r
179 #endif\r
180} CMtDec;\r
181\r
182\r
183void MtDec_Construct(CMtDec *p);\r
184void MtDec_Destruct(CMtDec *p);\r
185\r
186/*\r
187MtDec_Code() returns:\r
188 SZ_OK - in most cases\r
189 MY_SRes_HRESULT_FROM_WRes(WRes_error) - in case of unexpected error in threading function\r
190*/\r
191 \r
192SRes MtDec_Code(CMtDec *p);\r
193Byte *MtDec_GetCrossBuff(CMtDec *p);\r
194\r
195int MtDec_PrepareRead(CMtDec *p);\r
196const Byte *MtDec_Read(CMtDec *p, size_t *inLim);\r
197\r
198#endif\r
199\r
200EXTERN_C_END\r
201\r
202#endif\r