blob: 705208ed3b4084ac20afe89361e6f94d80e04493 [file] [log] [blame]
repo syncbaa38582013-07-26 17:53:31 -07001/* MtCoder.h -- Multi-thread Coder
22009-11-19 : Igor Pavlov : Public domain */
3
4#ifndef __MT_CODER_H
5#define __MT_CODER_H
6
7#include "Threads.h"
8
9EXTERN_C_BEGIN
10
11typedef struct
12{
13 CThread thread;
14 CAutoResetEvent startEvent;
15 CAutoResetEvent finishedEvent;
16 int stop;
17
18 THREAD_FUNC_TYPE func;
19 LPVOID param;
20 THREAD_FUNC_RET_TYPE res;
21} CLoopThread;
22
23void LoopThread_Construct(CLoopThread *p);
24void LoopThread_Close(CLoopThread *p);
25WRes LoopThread_Create(CLoopThread *p);
26WRes LoopThread_StopAndWait(CLoopThread *p);
27WRes LoopThread_StartSubThread(CLoopThread *p);
28WRes LoopThread_WaitSubThread(CLoopThread *p);
29
30#ifndef _7ZIP_ST
31#define NUM_MT_CODER_THREADS_MAX 32
32#else
33#define NUM_MT_CODER_THREADS_MAX 1
34#endif
35
36typedef struct
37{
38 UInt64 totalInSize;
39 UInt64 totalOutSize;
40 ICompressProgress *progress;
41 SRes res;
42 CCriticalSection cs;
43 UInt64 inSizes[NUM_MT_CODER_THREADS_MAX];
44 UInt64 outSizes[NUM_MT_CODER_THREADS_MAX];
45} CMtProgress;
46
47SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize);
48
49struct _CMtCoder;
50
51typedef struct
52{
53 struct _CMtCoder *mtCoder;
54 Byte *outBuf;
55 size_t outBufSize;
56 Byte *inBuf;
57 size_t inBufSize;
58 unsigned index;
59 CLoopThread thread;
60
61 Bool stopReading;
62 Bool stopWriting;
63 CAutoResetEvent canRead;
64 CAutoResetEvent canWrite;
65} CMtThread;
66
67typedef struct
68{
69 SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize,
70 const Byte *src, size_t srcSize, int finished);
71} IMtCoderCallback;
72
73typedef struct _CMtCoder
74{
75 size_t blockSize;
76 size_t destBlockSize;
77 unsigned numThreads;
78
79 ISeqInStream *inStream;
80 ISeqOutStream *outStream;
81 ICompressProgress *progress;
82 ISzAlloc *alloc;
83
84 IMtCoderCallback *mtCallback;
85 CCriticalSection cs;
86 SRes res;
87
88 CMtProgress mtProgress;
89 CMtThread threads[NUM_MT_CODER_THREADS_MAX];
90} CMtCoder;
91
92void MtCoder_Construct(CMtCoder* p);
93void MtCoder_Destruct(CMtCoder* p);
94SRes MtCoder_Code(CMtCoder *p);
95
96EXTERN_C_END
97
98#endif