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