/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * * PCR - I/O global descriptor support on Unix File System. * * This deals mostly with wait for host descriptor ready. * * Not for client use. */ #ifndef ←←PCR←IOGblUFS←h #define ←←PCR←IOGblUFS←h 1 #include <config/PCR←StdDefs.h> #include <config/PCR←OS.h> #include <th/PCR←Th.h> #include <io/PCR←IOGbl.h> #include <sys/stat.h> #if PCR←OS←EWOULDBLOCK # define PCR←IOGblUFS←ShouldRetry(res) \ ( ((res) == PCR←ERes←FromErr(EWOULDBLOCK)) \ || ((res) == PCR←ERes←FromErr(EAGAIN))\ || ((res) == PCR←ERes←FromErr(EINTR)) ) #else # define PCR←IOGblUFS←ShouldRetry(res) \ ( ((res) == PCR←ERes←FromErr(EAGAIN)) \ || ((res) == PCR←ERes←FromErr(EINTR)) ) #endif #define PCR←IOGblUFS←HOSTFD(gde) \ ((gde)->gde←data[0].gde←data←←long) #define PCR←IOGblUFS←SPLITSIZE(gde) \ ((gde)->gde←data[1].gde←data←←long) #define PCR←IOGblUFS←DEFAULTSPLITSIZE (16*1024) extern PCR←ERes PCR←IOGblUFS←SetHostFDBlocking(int hd, PCR←Bool blocking); /* Turn on/off host descriptor blocking behavior. */ extern PCR←ERes PCR←IOGblUFS←InstallHostFD( PCR←IOGbl←DEPtr gde, int hd ); extern PCR←ERes PCR←IOGblUFS←InstallHostFDs( PCR←IOGbl←DEPtr gde0, PCR←IOGbl←DEPtr gde1, int hd0, int hd1 ); /* Create association between allocated gde's and host fd's. On failure, caller is responsible for closing hd's. */ #if PCR←OS←POLL # include <host/poll.h> /* extern int poll(struct pollfd *fds, unsigned long nfds, int timeout); */ #else struct pollfd { int fd; short events; short revents; }; # define POLLIN 01 # define POLLPRI 02 # define POLLOUT 04 # define POLLERR 010 # define POLLHUP 020 # define POLLNVAL 040 #endif typedef volatile struct PCR←IOGblUFS←WaitReadyInfoRep * PCR←IOGblUFS←WaitReadyInfoPtr; typedef struct PCR←IOGblUFS←WaitReadyInfoRep { PCR←IOGblUFS←WaitReadyInfoPtr ufswri←next; PCR←IOGblUFS←WaitReadyInfoPtr ufswri←prev; PCR←IOGbl←DEPtr ufswri←gde; PCR←Th←CV ufswri←cvAny; PCR←Th←CV ufswri←cvIn; PCR←Th←CV ufswri←cvOut; int ufswri←pollSlot; } PCR←IOGblUFS←WaitReadyInfo; extern volatile PCR←IOGblUFS←WaitReadyInfoPtr PCR←IOGblUFS←waitReadyInfo; extern volatile PCR←IOGblUFS←WaitReadyInfoPtr PCR←IOGblUFS←waitReadyInfoSet; extern struct pollfd * PCR←IOGblUFS←pollfds; extern volatile int PCR←IOGblUFS←pollfdCnt; extern PCR←ERes PCR←IOGblUFS←WaitGDEReady( PCR←IOGbl←DEPtr gde, int events, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); /* Wait for gbl descriptor ready for one of given events, or for error on the descriptor. */ extern PCR←ERes PCR←IOGblUFS←WaitHDReady( int hd, int events, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); /* Wait for host descriptor ready for one of given events, or for error on descriptor. Caller must be in sys critical section. */ extern void PCR←IOGblUFS←NotifyHDReady( int hd ); /* Caller must be in sys critical section. */ extern void PCR←IOGblUFS←NotifyHDClosed( int hd ); /* Caller must be in sys critical section. */ #endif /* ! ←←PCR←IOGblUFS←h */ /* $Log$ */