82 lines · 2.4 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ typedef struct Thwack		Thwack;typedef struct Unthwack		Unthwack;typedef struct ThwBlock		ThwBlock;typedef struct UnthwBlock	UnthwBlock; enum{	ThwStats	= 8,	ThwErrLen	= 64,		/* max length of error message from thwack or unthwack */	ThwMaxBlock	= 1600,		/* max size of compressible block */ 	HashLog		= 12,	HashSize	= 1<<HashLog,	HashMask	= HashSize - 1, 	MinMatch	= 3,		/* shortest match possible */ 	MaxOff		= 8,	OffBase		= 6, 	MinDecode	= 8,		/* minimum bits to decode a match or lit; >= 8 */ 	CompBlocks	= 10,		/* max blocks used to encode data */	EWinBlocks	= 64,		/* blocks held in encoder window */	DWinBlocks	= EWinBlocks,	/* blocks held in decoder window */ 	MaxSeqMask	= 8,		/* number of bits in coding block mask */	MaxSeqStart	= 256		/* max offset of initial coding block */}; struct ThwBlock{	ulong	seq;			/* sequence number for this data */	uchar	acked;			/* ok to use this block; the decoder has it */	ushort	begin;			/* time of first byte in hash */	uchar	*edata;			/* last byte of valid data */	ushort	maxoff;			/* time of last valid hash entry */	ushort	*hash;	uchar	*data;}; struct Thwack{	QLock		acklock;	/* locks slot, blocks[].(acked|seq) */	int		slot;		/* next block to use */	ThwBlock	blocks[EWinBlocks];	ushort		hash[EWinBlocks][HashSize];	Block		*data[EWinBlocks];}; struct UnthwBlock{	ulong	seq;			/* sequence number for this data */	ushort	maxoff;			/* valid data in each block */	uchar	*data;}; struct Unthwack{	int		slot;		/* next block to use */	char		err[ThwErrLen];	UnthwBlock	blocks[DWinBlocks];	uchar		data[DWinBlocks][ThwMaxBlock];}; void	thwackinit(Thwack*);void	thwackcleanup(Thwack *tw);void	unthwackinit(Unthwack*);int	thwack(Thwack*, int mustadd, uchar *dst, int ndst, Block *bsrc, ulong seq, ulong stats[ThwStats]);void	thwackack(Thwack*, ulong seq, ulong mask);int	unthwack(Unthwack*, uchar *dst, int ndst, uchar *src, int nsrc, ulong seq);ulong	unthwackstate(Unthwack *ut, uchar *mask);int	unthwackadd(Unthwack *ut, uchar *src, int nsrc, ulong seq);