Home | History | Annotate | Download | only in C
      1 /* MtCoder.h -- Multi-thread Coder
      2 2009-11-19 : Igor Pavlov : Public domain */
      3 
      4 #ifndef __MT_CODER_H
      5 #define __MT_CODER_H
      6 
      7 #include "Threads.h"
      8 
      9 EXTERN_C_BEGIN
     10 
     11 typedef 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 
     23 void LoopThread_Construct(CLoopThread *p);
     24 void LoopThread_Close(CLoopThread *p);
     25 WRes LoopThread_Create(CLoopThread *p);
     26 WRes LoopThread_StopAndWait(CLoopThread *p);
     27 WRes LoopThread_StartSubThread(CLoopThread *p);
     28 WRes 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 
     36 typedef 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 
     47 SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize);
     48 
     49 struct _CMtCoder;
     50 
     51 typedef 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 
     67 typedef 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 
     73 typedef 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 
     92 void MtCoder_Construct(CMtCoder* p);
     93 void MtCoder_Destruct(CMtCoder* p);
     94 SRes MtCoder_Code(CMtCoder *p);
     95 
     96 EXTERN_C_END
     97 
     98 #endif
     99