4
* Oliver Fromme <oliver.fromme@heim3.tu-clausthal.de>
5
* Sun Apr 6 02:26:26 MET DST 1997
7
* See xfermem.h for documentation/description.
17
#include <sys/types.h>
21
#include <sys/socket.h>
25
#include <sys/select.h>
37
#if defined (USE_MMAP) && defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
38
#define MAP_ANON MAP_ANONYMOUS
41
void xfermem_init (txfermem **xf, int bufsize, int msize, int skipbuf)
43
int regsize = bufsize + msize + skipbuf + sizeof(txfermem);
48
if ((*xf = (txfermem *) mmap(0, regsize, PROT_READ | PROT_WRITE,
49
MAP_ANON | MAP_SHARED, -1, 0)) == (txfermem *) -1) {
55
if ((devzero = open("/dev/zero", O_RDWR, 0)) == -1) {
56
perror ("open(/dev/zero)");
59
if ((*xf = (txfermem *) mmap(0, regsize, PROT_READ | PROT_WRITE,
60
MAP_SHARED, devzero, 0)) == (txfermem *) -1) {
67
struct shmid_ds shmemds;
69
if ((shmemid = shmget(IPC_PRIVATE, regsize, IPC_CREAT | 0600)) == -1) {
73
if ((*xf = (txfermem *) shmat(shmemid, 0, 0)) == (txfermem *) -1) {
75
shmctl (shmemid, IPC_RMID, &shmemds);
78
if (shmctl(shmemid, IPC_RMID, &shmemds) == -1) {
84
if (socketpair(AF_UNIX, SOCK_STREAM, 0, (*xf)->fd) < 0) {
85
perror ("socketpair()");
89
(*xf)->freeindex = (*xf)->readindex = 0;
90
(*xf)->wakeme[0] = (*xf)->wakeme[1] = FALSE;
91
(*xf)->data = ((byte *) *xf) + sizeof(txfermem) + msize;
92
(*xf)->metadata = ((byte *) *xf) + sizeof(txfermem);
93
(*xf)->size = bufsize;
94
(*xf)->metasize = msize + skipbuf;
98
void xfermem_done (txfermem *xf)
103
munmap ((caddr_t) xf, xf->size + xf->metasize + sizeof(txfermem));
105
if (shmdt((void *) xf) == -1) {
112
void xfermem_init_writer (txfermem *xf)
115
close (xf->fd[XF_READER]);
118
void xfermem_init_reader (txfermem *xf)
121
close (xf->fd[XF_WRITER]);
124
int xfermem_get_freespace (txfermem *xf)
126
int freeindex, readindex;
131
if ((freeindex = xf->freeindex) < 0
132
|| (readindex = xf->readindex) < 0)
134
if (readindex > freeindex)
135
return ((readindex - freeindex) - 1);
137
return ((xf->size - (freeindex - readindex)) - 1);
140
int xfermem_get_usedspace (txfermem *xf)
142
int freeindex, readindex;
147
if ((freeindex = xf->freeindex) < 0
148
|| (readindex = xf->readindex) < 0)
150
if (freeindex >= readindex)
151
return (freeindex - readindex);
153
return (xf->size - (readindex - freeindex));
156
int xfermem_getcmd (int fd, int block)
162
struct timeval selto = {0, 0};
165
FD_SET (fd, &selfds);
166
/* #ifdef HPUX */ /* seems to trigger performance problems? strange */
168
switch (select(FD_SETSIZE, (int *) &selfds, NULL, NULL, block ? NULL : &selto)) {
170
switch (select(FD_SETSIZE, &selfds, NULL, NULL, block ? NULL : &selto)) {
181
if (FD_ISSET(fd, &selfds))
182
switch (read(fd, &cmd, 1)) {
202
int xfermem_putcmd (int fd, byte cmd)
205
switch (write(fd, &cmd, 1)) {
215
int xfermem_block (int readwrite, txfermem *xf)
217
int myfd = xf->fd[readwrite];
220
xf->wakeme[readwrite] = TRUE;
221
if (xf->wakeme[1 - readwrite])
222
xfermem_putcmd (myfd, XF_CMD_WAKEUP);
223
result = xfermem_getcmd(myfd, TRUE);
224
xf->wakeme[readwrite] = FALSE;
225
return ((result <= 0) ? -1 : result);
233
#include <sys/types.h>
240
void xfermem_init (txfermem **xf, int bufsize, int msize, int skipbuf)
243
void xfermem_done (txfermem *xf)
246
void xfermem_init_writer (txfermem *xf)
249
void xfermem_init_reader (txfermem *xf)
252
int xfermem_get_freespace (txfermem *xf)
256
int xfermem_get_usedspace (txfermem *xf)
260
int xfermem_getcmd (int fd, int block)
264
int xfermem_putcmd (int fd, byte cmd)
268
int xfermem_block (int readwrite, txfermem *xf)