Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* LzFindMt.h -- multithreaded Match finder for LZ algorithms
  2. 2008-10-04 : Igor Pavlov : Public domain */
  3.  
  4. #ifndef __LZFINDMT_H
  5. #define __LZFINDMT_H
  6.  
  7. #include "Threads.h"
  8. #include "LzFind.h"
  9.  
  10. #define kMtHashBlockSize (1 << 13)
  11. #define kMtHashNumBlocks (1 << 3)
  12. #define kMtHashNumBlocksMask (kMtHashNumBlocks - 1)
  13.  
  14. #define kMtBtBlockSize (1 << 14)
  15. #define kMtBtNumBlocks (1 << 6)
  16. #define kMtBtNumBlocksMask (kMtBtNumBlocks - 1)
  17.  
  18. typedef struct _CMtSync
  19. {
  20.   Bool wasCreated;
  21.   Bool needStart;
  22.   Bool exit;
  23.   Bool stopWriting;
  24.  
  25.   CThread thread;
  26.   CAutoResetEvent canStart;
  27.   CAutoResetEvent wasStarted;
  28.   CAutoResetEvent wasStopped;
  29.   CSemaphore freeSemaphore;
  30.   CSemaphore filledSemaphore;
  31.   Bool csWasInitialized;
  32.   Bool csWasEntered;
  33.   CCriticalSection cs;
  34.   UInt32 numProcessedBlocks;
  35. } CMtSync;
  36.  
  37. typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);
  38.  
  39. /* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
  40. #define kMtCacheLineDummy 128
  41.  
  42. typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
  43.   UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
  44.  
  45. typedef struct _CMatchFinderMt
  46. {
  47.   /* LZ */
  48.   const Byte *pointerToCurPos;
  49.   UInt32 *btBuf;
  50.   UInt32 btBufPos;
  51.   UInt32 btBufPosLimit;
  52.   UInt32 lzPos;
  53.   UInt32 btNumAvailBytes;
  54.  
  55.   UInt32 *hash;
  56.   UInt32 fixedHashSize;
  57.   UInt32 historySize;
  58.   const UInt32 *crc;
  59.  
  60.   Mf_Mix_Matches MixMatchesFunc;
  61.  
  62.   /* LZ + BT */
  63.   CMtSync btSync;
  64.   Byte btDummy[kMtCacheLineDummy];
  65.  
  66.   /* BT */
  67.   UInt32 *hashBuf;
  68.   UInt32 hashBufPos;
  69.   UInt32 hashBufPosLimit;
  70.   UInt32 hashNumAvail;
  71.  
  72.   CLzRef *son;
  73.   UInt32 matchMaxLen;
  74.   UInt32 numHashBytes;
  75.   UInt32 pos;
  76.   Byte *buffer;
  77.   UInt32 cyclicBufferPos;
  78.   UInt32 cyclicBufferSize; /* it must be historySize + 1 */
  79.   UInt32 cutValue;
  80.  
  81.   /* BT + Hash */
  82.   CMtSync hashSync;
  83.   /* Byte hashDummy[kMtCacheLineDummy]; */
  84.  
  85.   /* Hash */
  86.   Mf_GetHeads GetHeadsFunc;
  87.   CMatchFinder *MatchFinder;
  88. } CMatchFinderMt;
  89.  
  90. void MatchFinderMt_Construct(CMatchFinderMt *p);
  91. void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc);
  92. SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
  93.     UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc);
  94. void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable);
  95. void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
  96.  
  97. #endif
  98.