99 lines
1.9 KiB
C
99 lines
1.9 KiB
C
/* MtCoder.h -- Multi-thread Coder
|
|
2009-11-19 : Igor Pavlov : Public domain */
|
|
|
|
#ifndef __MT_CODER_H
|
|
#define __MT_CODER_H
|
|
|
|
#include "Threads.h"
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
typedef struct
|
|
{
|
|
CThread thread;
|
|
CAutoResetEvent startEvent;
|
|
CAutoResetEvent finishedEvent;
|
|
int stop;
|
|
|
|
THREAD_FUNC_TYPE func;
|
|
LPVOID param;
|
|
THREAD_FUNC_RET_TYPE res;
|
|
} CLoopThread;
|
|
|
|
void LoopThread_Construct(CLoopThread *p);
|
|
void LoopThread_Close(CLoopThread *p);
|
|
WRes LoopThread_Create(CLoopThread *p);
|
|
WRes LoopThread_StopAndWait(CLoopThread *p);
|
|
WRes LoopThread_StartSubThread(CLoopThread *p);
|
|
WRes LoopThread_WaitSubThread(CLoopThread *p);
|
|
|
|
#ifndef _7ZIP_ST
|
|
#define NUM_MT_CODER_THREADS_MAX 32
|
|
#else
|
|
#define NUM_MT_CODER_THREADS_MAX 1
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
UInt64 totalInSize;
|
|
UInt64 totalOutSize;
|
|
ICompressProgress *progress;
|
|
SRes res;
|
|
CCriticalSection cs;
|
|
UInt64 inSizes[NUM_MT_CODER_THREADS_MAX];
|
|
UInt64 outSizes[NUM_MT_CODER_THREADS_MAX];
|
|
} CMtProgress;
|
|
|
|
SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize);
|
|
|
|
struct _CMtCoder;
|
|
|
|
typedef struct
|
|
{
|
|
struct _CMtCoder *mtCoder;
|
|
Byte *outBuf;
|
|
size_t outBufSize;
|
|
Byte *inBuf;
|
|
size_t inBufSize;
|
|
unsigned index;
|
|
CLoopThread thread;
|
|
|
|
Bool stopReading;
|
|
Bool stopWriting;
|
|
CAutoResetEvent canRead;
|
|
CAutoResetEvent canWrite;
|
|
} CMtThread;
|
|
|
|
typedef struct
|
|
{
|
|
SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize,
|
|
const Byte *src, size_t srcSize, int finished);
|
|
} IMtCoderCallback;
|
|
|
|
typedef struct _CMtCoder
|
|
{
|
|
size_t blockSize;
|
|
size_t destBlockSize;
|
|
unsigned numThreads;
|
|
|
|
ISeqInStream *inStream;
|
|
ISeqOutStream *outStream;
|
|
ICompressProgress *progress;
|
|
ISzAlloc *alloc;
|
|
|
|
IMtCoderCallback *mtCallback;
|
|
CCriticalSection cs;
|
|
SRes res;
|
|
|
|
CMtProgress mtProgress;
|
|
CMtThread threads[NUM_MT_CODER_THREADS_MAX];
|
|
} CMtCoder;
|
|
|
|
void MtCoder_Construct(CMtCoder* p);
|
|
void MtCoder_Destruct(CMtCoder* p);
|
|
SRes MtCoder_Code(CMtCoder *p);
|
|
|
|
EXTERN_C_END
|
|
|
|
#endif
|