Source code

Revision control

Copy as Markdown

Other Tools

/* MtCoder.h -- Multi-thread Coder↩
2018-02-21 : Igor Pavlov : Public domain */
#ifndef __MT_CODER_H↩
#define __MT_CODER_H↩
#include "MtDec.h"
EXTERN_C_BEGIN↩
/*↩
if ( defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream↩
if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream↩
*/
/* #define MTCODER__USE_WRITE_THREAD */
#ifndef _7ZIP_ST↩
#define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1)↩
#define MTCODER__THREADS_MAX 64↩
#define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3)↩
#else
#define MTCODER__THREADS_MAX 1↩
#define MTCODER__BLOCKS_MAX 1↩
#endif
#ifndef _7ZIP_ST↩
typedef struct
{↩
ICompressProgress vt;↩
CMtProgress *mtProgress;↩
UInt64 inSize;↩
UInt64 outSize;↩
} CMtProgressThunk;↩
void MtProgressThunk_CreateVTable(CMtProgressThunk *p);↩
#define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; }↩
struct _CMtCoder;↩
typedef struct
{↩
struct _CMtCoder *mtCoder;↩
unsigned index;↩
int stop;↩
Byte *inBuf;↩
CAutoResetEvent startEvent;↩
CThread thread;↩
} CMtCoderThread;↩
typedef struct
{↩
SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex,↩
const Byte *src, size_t srcSize, int finished);↩
SRes (*Write)(void *p, unsigned outBufIndex);↩
} IMtCoderCallback2;↩
typedef struct
{↩
SRes res;↩
unsigned bufIndex;↩
Bool finished;↩
} CMtCoderBlock;↩
typedef struct _CMtCoder↩
{↩
/* input variables */
size_t blockSize; /* size of input block */
unsigned numThreadsMax;↩
UInt64 expectedDataSize;↩
ISeqInStream *inStream;↩
const Byte *inData;↩
size_t inDataSize;↩
ICompressProgress *progress;↩
ISzAllocPtr allocBig;↩
IMtCoderCallback2 *mtCallback;↩
void *mtCallbackObject;↩
/* internal variables */
size_t allocatedBufsSize;↩
CAutoResetEvent readEvent;↩
CSemaphore blocksSemaphore;↩
Bool stopReading;↩
SRes readRes;↩
#ifdef MTCODER__USE_WRITE_THREAD↩
CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX];↩
#else
CAutoResetEvent finishedEvent;↩
SRes writeRes;↩
unsigned writeIndex;↩
Byte ReadyBlocks[MTCODER__BLOCKS_MAX];↩
LONG numFinishedThreads;↩
#endif
unsigned numStartedThreadsLimit;↩
unsigned numStartedThreads;↩
unsigned numBlocksMax;↩
unsigned blockIndex;↩
UInt64 readProcessed;↩
CCriticalSection cs;↩
unsigned freeBlockHead;↩
unsigned freeBlockList[MTCODER__BLOCKS_MAX];↩
CMtProgress mtProgress;↩
CMtCoderBlock blocks[MTCODER__BLOCKS_MAX];↩
CMtCoderThread threads[MTCODER__THREADS_MAX];↩
} CMtCoder;↩
void MtCoder_Construct(CMtCoder *p);↩
void MtCoder_Destruct(CMtCoder *p);↩
SRes MtCoder_Code(CMtCoder *p);↩
#endif
EXTERN_C_END↩
#endif