tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MtCoder.h (2895B)


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