/* LzFindMt.h -- multithreaded Match finder for LZ algorithms
 
2008-10-04 : Igor Pavlov : Public domain */
 
 
 
#ifndef __LZFINDMT_H
 
#define __LZFINDMT_H
 
 
 
#include "Threads.h"
 
#include "LzFind.h"
 
 
 
#define kMtHashBlockSize (1 << 13)
 
#define kMtHashNumBlocks (1 << 3)
 
#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1)
 
 
 
#define kMtBtBlockSize (1 << 14)
 
#define kMtBtNumBlocks (1 << 6)
 
#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1)
 
 
 
typedef struct _CMtSync
 
{
 
  Bool wasCreated;
 
  Bool needStart;
 
  Bool exit;
 
  Bool stopWriting;
 
 
 
  CThread thread;
 
  CAutoResetEvent canStart;
 
  CAutoResetEvent wasStarted;
 
  CAutoResetEvent wasStopped;
 
  CSemaphore freeSemaphore;
 
  CSemaphore filledSemaphore;
 
  Bool csWasInitialized;
 
  Bool csWasEntered;
 
  CCriticalSection cs;
 
  UInt32 numProcessedBlocks;
 
} CMtSync;
 
 
 
typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);
 
 
 
/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
 
#define kMtCacheLineDummy 128
 
 
 
typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
 
  UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
 
 
 
typedef struct _CMatchFinderMt
 
{
 
  /* LZ */
 
  const Byte *pointerToCurPos;
 
  UInt32 *btBuf;
 
  UInt32 btBufPos;
 
  UInt32 btBufPosLimit;
 
  UInt32 lzPos;
 
  UInt32 btNumAvailBytes;
 
 
 
  UInt32 *hash;
 
  UInt32 fixedHashSize;
 
  UInt32 historySize;
 
  const UInt32 *crc;
 
 
 
  Mf_Mix_Matches MixMatchesFunc;
 
  
 
  /* LZ + BT */
 
  CMtSync btSync;
 
  Byte btDummy[kMtCacheLineDummy];
 
 
 
  /* BT */
 
  UInt32 *hashBuf;
 
  UInt32 hashBufPos;
 
  UInt32 hashBufPosLimit;
 
  UInt32 hashNumAvail;
 
 
 
  CLzRef *son;
 
  UInt32 matchMaxLen;
 
  UInt32 numHashBytes;
 
  UInt32 pos;
 
  Byte *buffer;
 
  UInt32 cyclicBufferPos;
 
  UInt32 cyclicBufferSize; /* it must be historySize + 1 */
 
  UInt32 cutValue;
 
 
 
  /* BT + Hash */
 
  CMtSync hashSync;
 
  /* Byte hashDummy[kMtCacheLineDummy]; */
 
  
 
  /* Hash */
 
  Mf_GetHeads GetHeadsFunc;
 
  CMatchFinder *MatchFinder;
 
} CMatchFinderMt;
 
 
 
void MatchFinderMt_Construct(CMatchFinderMt *p);
 
void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc);
 
SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
 
    UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc);
 
void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable);
 
void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
 
 
 
#endif