/* @(#)fifo.h	1.9 02/08/08 Copyright 1989 J. Schilling */
/*
 *	Definitions for a "fifo" that uses
 *	shared memory between two processes
 *
 *	Copyright (c) 1989 J. Schilling
 */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */

typedef	struct	{
	BOOL	reading;	/* true if currently reading from tape	*/
	int	swapflg;	/* -1: init, 0: FALSE, 1: TRUE		*/
	int	volno;		/* Volume #				*/
	int	nblocks;	/* Blocksize for each transfer in TBLOCK*/
	long	blocksize;	/* Blocksize for each transfer in bytes	*/
	long	lastsize;	/* Size of last transfer (for backtape)	*/
	Llong	blocks;		/* Full blocks transfered on Volume	*/
	Llong	parts;		/* Bytes fom partial transferes on Volume */
	Llong	Tblocks;	/* Total blocks transfered		*/
	Llong	Tparts;		/* Total Bytes fom parttial transferes	*/
} m_stats;

typedef struct {
	char	*putptr;	/* put pointer within shared memory */
	char	*getptr;	/* get pointer within shared memory */
	char	*base;		/* base of fifo within shared memory segment*/
	char	*end;		/* end of real shared memory segment */
	int	size;		/* size of fifo within shared memory segment*/
	int	ibs;		/* input transfer size	*/
	int	obs;		/* output transfer size	*/
	unsigned long	icnt;	/* input count (incremented on each put) */
	unsigned long	ocnt;	/* output count (incremented on each get) */
	int	hiw;		/* highwater mark */
	int	low;		/* lowwater mark */
	int	flags;		/* fifo flags */
	int	ferrno;		/* errno from fifo background process */
	int	gp[2];		/* sync pipe for get process */
	int	pp[2];		/* sync pipe for put process */
	int	puts;		/* fifo put count statistic */
	int	gets;		/* fifo get get statistic */
	int	empty;		/* fifo was empty count statistic */
	int	full;		/* fifo was full count statistic */
	int	maxfill;	/* max # of bytes in fifo */
	m_stats	stats;		/* statistics			*/
} m_head;

#define	gpin	gp[0]		/* get pipe in  */
#define	gpout	gp[1]		/* get pipe out */
#define	ppin	pp[0]		/* put pipe in  */
#define	ppout	pp[1]		/* put pipe out */

#define	FIFO_AMOUNT(p)	((p)->icnt - (p)->ocnt)

#define	FIFO_IBLOCKED	0x001	/* input  (put side) is blocked	*/
#define	FIFO_OBLOCKED	0x002	/* output (get side) is blocked	*/
#define	FIFO_FULL	0x004	/* fifo is full			*/
#define	FIFO_MEOF	0x008	/* EOF on input (put side)	*/
#define	FIFO_MERROR	0x010	/* error on input (put side)	*/
#define	FIFO_EXIT	0x020	/* exit() on non tape side	*/
#define	FIFO_EXERRNO	0x040	/* errno from non tape side	*/

#define	FIFO_IWAIT	0x200	/* input (put side) waits after first record */
#define	FIFO_I_CHREEL	0x400	/* change input tape reel if fifo gets empty */
#define	FIFO_O_CHREEL	0x800	/* change output tape reel if fifo gets empty*/

#if	!defined(HAVE_SMMAP) && !defined(HAVE_USGSHM) && !defined(HAVE_DOSALLOCSHAREDMEM)
#undef	FIFO			/* We cannot have a FIFO on this platform */
#endif
