/* * xfermem.h * * Oliver Fromme * Sat Mar 29 04:41:34 MET 1997 * * This is a stand-alone module which implements a unidirectional, * fast pipe using mmap(). Its primary use is to transfer large * amounts of data from a parent process to its child process, * with a buffer in between which decouples blocking conditions * on both sides. Control information is transferred between the * processes through a socketpair. See xftest.c for an example on * how to use this module. */ #ifndef TRUE #define FALSE 0 #define TRUE 1 #endif typedef struct { int freeindex; /* [W] next free index */ int readindex; /* [R] next index to read */ int fd[2]; int wakeme[2]; byte *data; byte *metadata; int size; int metasize; int buf[3]; } txfermem; /* * [W] -- May be written to by the writing process only! * [R] -- May be written to by the reading process only! * All other entries are initialized once. */ void xfermem_init (txfermem **xf, int bufsize, int msize,int skipbuf); void xfermem_init_writer (txfermem *xf); void xfermem_init_reader (txfermem *xf); int xfermem_write (txfermem *xf, byte *data, int count); int xfermem_read (txfermem *xf, byte *data, int count); int xfermem_get_freespace (txfermem *xf); int xfermem_get_usedspace (txfermem *xf); #define XF_CMD_WAKEUP_INFO 0x04 #define XF_CMD_WAKEUP 0x02 #define XF_CMD_TERMINATE 0x03 #define XF_WRITER 0 #define XF_READER 1 int xfermem_getcmd (int fd, int block); int xfermem_putcmd (int fd, byte cmd); int xfermem_block (int fd, txfermem *xf); void xfermem_done (txfermem *xf); #define xfermem_done_writer xfermem_init_reader #define xfermem_done_reader xfermem_init_writer /* EOF */