/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * * PCR - I/O global (per-pcr-world) descriptor support * * Not for client use. */ #ifndef ←←PCR←IOGbl←h #define ←←PCR←IOGbl←h 1 #include <config/PCR←StdDefs.h> #include <th/PCR←Th.h> #include <sys/stat.h> #include <io/PCR←IO.h> typedef volatile struct PCR←IOGbl←DERep * PCR←IOGbl←DEPtr; typedef struct PCR←IOGbl←DEProcsRep * PCR←IOGbl←DEProcsPtr; /* * I/O methods of global descriptor objects */ typedef PCR←ERes PCR←IOGbl←ReadProc( PCR←IOGbl←DEPtr gde, char *buf, unsigned int nbyte, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←ReadProc PCR←IOGbl←Read; typedef PCR←ERes PCR←IOGbl←WriteProc( PCR←IOGbl←DEPtr gde, char *buf, unsigned int nbyte, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←WriteProc PCR←IOGbl←Write; typedef PCR←ERes PCR←IOGbl←LSeekProc( PCR←IOGbl←DEPtr gde, off←t offset, int whence, off←t *where, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←LSeekProc PCR←IOGbl←LSeek; typedef PCR←ERes PCR←IOGbl←FStatProc( PCR←IOGbl←DEPtr gde, struct PCR←stat *sbuf, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FStatProc PCR←IOGbl←FStat; typedef PCR←ERes PCR←IOGbl←FPathConfProc( PCR←IOGbl←DEPtr gde, int name, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FPathConfProc PCR←IOGbl←FPathConf; typedef PCR←ERes PCR←IOGbl←FCntlProc( PCR←IOGbl←DEPtr gde, int cmd, PCR←Any arg, int *ansp, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FCntlProc PCR←IOGbl←FCntl; typedef PCR←ERes PCR←IOGbl←WaitReadyProc( PCR←IOGbl←DEPtr gde, PCR←IO←WaitReadyEvents events, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←WaitReadyProc PCR←IOGbl←WaitReady; typedef PCR←ERes PCR←IOGbl←GenericOpProc( PCR←IOGbl←DEPtr gde, const PCR←sigset←t *sigMask, PCR←Msec wakeup, PCR←Any cmd, ... ); extern PCR←IOGbl←GenericOpProc * (PCR←IOGbl←GetGenericOpProc(PCR←IOGbl←DEPtr)); int PCR←IOGbl←←ctlGenericOpCmd; #define PCR←IOGbl←ctlGenericOpCmd \ ((PCR←Any)(&PCR←IOGbl←←ctlGenericOpCmd)) PCR←Bool PCR←IOGbl←doAllIOCtls; typedef PCR←ERes PCR←IOGbl←GenericCloneProc( PCR←IOGbl←DEPtr gde, const PCR←sigset←t *sigMask, PCR←Msec wakeup, PCR←IOGbl←DEPtr * gdep, PCR←Any cmd, ... ); extern PCR←IOGbl←GenericCloneProc * (PCR←IOGbl←GetGenericCloneProc(PCR←IOGbl←DEPtr)); typedef PCR←ERes PCR←IOGbl←FSyncProc( PCR←IOGbl←DEPtr gde, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FSyncProc PCR←IOGbl←FSync; typedef PCR←ERes PCR←IOGbl←FChModProc( PCR←IOGbl←DEPtr gde, mode←t mode, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FChModProc PCR←IOGbl←FChMod; typedef PCR←ERes PCR←IOGbl←FChOwnProc( PCR←IOGbl←DEPtr gde, uid←t owner, gid←t group, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FChOwnProc PCR←IOGbl←FChOwn; typedef PCR←ERes PCR←IOGbl←FTruncateProc( PCR←IOGbl←DEPtr gde, off←t length, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←FTruncateProc PCR←IOGbl←FTruncate; typedef PCR←ERes PCR←IOGbl←CloseProc( PCR←IOGbl←DEPtr gde, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); extern PCR←IOGbl←CloseProc PCR←IOGbl←Close; typedef struct PCR←IOGbl←DEProcsRep { PCR←IOGbl←ReadProc * gdep←read; PCR←IOGbl←WriteProc * gdep←write; PCR←IOGbl←LSeekProc * gdep←lSeek; PCR←IOGbl←FStatProc * gdep←fStat; PCR←IOGbl←FPathConfProc * gdep←fPathConf; PCR←IOGbl←FCntlProc * gdep←fCntl; PCR←IOGbl←WaitReadyProc * gdep←waitReady; PCR←IOGbl←GenericOpProc * gdep←genericOp; PCR←IOGbl←GenericCloneProc * gdep←genericClone; PCR←IOGbl←FSyncProc * gdep←fSync; PCR←IOGbl←FChModProc * gdep←fChMod; PCR←IOGbl←FChOwnProc * gdep←fChOwn; PCR←IOGbl←FTruncateProc * gdep←fTruncate; PCR←IOGbl←CloseProc * gdep←close; } PCR←IOGbl←DEProcs; /* * global descriptor objects */ #define PCR←IOGbl←GDE←NDATA 2 typedef volatile struct PCR←IOGbl←DERep { /* procs */ PCR←IOGbl←DEProcsPtr gde←gdep; /* private data used by procs */ union { void * gde←data←←ptr; long gde←data←←long; } gde←data[PCR←IOGbl←GDE←NDATA]; /* translation to/from global fildes values */ PCR←ERes gde←gfd; /* ref counts -- global and cumulative (local+global) */ unsigned gde←gRefCnt; unsigned gde←refCnt; /* per-descriptor data for fcntl */ int gde←fcntlFD; int gde←fcntlFL; } PCR←IOGbl←DE; extern PCR←IOGbl←DEPtr * PCR←IOGbl←gde; extern PCR←IOGbl←DEPtr PCR←IOGbl←DEPtr←FromFD(int fildes); extern PCR←IOGbl←DEPtr PCR←IOGbl←DEPtr←FromGFD(int fildes); /* Convert a (global) fildes to a DEPtr. Result may be NIL (EBADF), or the returned gde may have been closed concurrently. */ #define PCR←IOGbl←DEPtr←←FromGFD(gfd) \ PCR←IOGbl←gde[gfd] #define PCR←IOGbl←DEPtr←FromGFD PCR←IOGbl←DEPtr←←FromGFD #define PCR←IOGbl←DEPtr←FromGFDChecked(gfd) \ ( PCR←IO←FDIsValidGlobal(gfd) ? PCR←IOGbl←DEPtr←FromGFD(gfd) : NIL ) #define PCR←IOGbl←DEPtr←FromFDChecked(fd) \ PCR←IOGbl←DEPtr←FromFD(fd) /* * Ref count manipulation, for dup, close etc. */ extern PCR←ERes PCR←IOGbl←DEPtr←AssignGFD(PCR←IOGbl←DEPtr gde, PCR←Bool gbl); /* Assign an unused GFD to gde. Initialize ref count. */ extern PCR←ERes PCR←IOGbl←DEPtr←AddRef(PCR←IOGbl←DEPtr gde, PCR←Bool gbl); /* Increment reference count. Fails if count is not already positive. */ PCR←ERes PCR←IOGbl←DEPtr←DelRef( PCR←IOGbl←DEPtr gde, PCR←Bool gbl, const PCR←sigset←t *sigMask, PCR←Msec wakeup ); /* Decrement ref count. When total ref count reaches 0, release gfd slot and call close proc. */ #define PCR←IOGbl←←Read(gde,buf,nbyte,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←read))(\ (gde),(buf),(nbyte),(sigMask),(wakeup)) ) #define PCR←IOGbl←Read PCR←IOGbl←←Read #define PCR←IOGbl←←Write(gde,buf,nbyte,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←write))(\ (gde),(buf),(nbyte),(sigMask),(wakeup)) ) #define PCR←IOGbl←Write PCR←IOGbl←←Write #define PCR←IOGbl←←LSeek(gde,offset,whence,where,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←lSeek))(\ (gde),(offset),(whence),(where),(sigMask),(wakeup)) ) #define PCR←IOGbl←LSeek PCR←IOGbl←←LSeek #define PCR←IOGbl←←FStat(gde,sbuf,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fStat))(\ (gde),(sbuf),(sigMask),(wakeup)) ) #define PCR←IOGbl←FStat PCR←IOGbl←←FStat #define PCR←IOGbl←←FPathConf(gde,name,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fPathConf))(\ (gde),(name),(sigMask),(wakeup)) ) #define PCR←IOGbl←FPathConf PCR←IOGbl←←FPathConf #define PCR←IOGbl←←FCntl(gde,cmd,arg,ansp,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fCntl))(\ (gde),(cmd),(arg),(ansp),(sigMask),(wakeup)) ) #define PCR←IOGbl←FCntl PCR←IOGbl←←FCntl #define PCR←IOGbl←←WaitReady(gde,events,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←waitReady))(\ (gde),(events),(sigMask),(wakeup)) ) #define PCR←IOGbl←WaitReady PCR←IOGbl←←WaitReady #define PCR←IOGbl←←GetGenericOpProc(gde) \ ((gde)->gde←gdep->gdep←genericOp) #define PCR←IOGbl←GetGenericOpProc PCR←IOGbl←←GetGenericOpProc #define PCR←IOGbl←←GetGenericCloneProc(gde) \ ((gde)->gde←gdep->gdep←genericClone) #define PCR←IOGbl←GetGenericCloneProc PCR←IOGbl←←GetGenericCloneProc #define PCR←IOGbl←←FSync(gde,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fSync))(\ (gde),(sigMask),(wakeup)) ) #define PCR←IOGbl←FSync PCR←IOGbl←←FSync #define PCR←IOGbl←←FChMod(gde,mode,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fChMod))(\ (gde),(mode),(sigMask),(wakeup)) ) #define PCR←IOGbl←FChMod PCR←IOGbl←←FChMod #define PCR←IOGbl←←FChOwn(gde,owner,group,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fChOwn))(\ (gde),(owner),(group),(sigMask),(wakeup)) ) #define PCR←IOGbl←FChOwn PCR←IOGbl←←FChOwn #define PCR←IOGbl←←FTruncate(gde,length,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←fTruncate))(\ (gde),(length),(sigMask),(wakeup)) ) #define PCR←IOGbl←FTruncate PCR←IOGbl←←FTruncate #define PCR←IOGbl←←Close(gde,sigMask,wakeup) \ ((*((gde)->gde←gdep->gdep←close))(\ (gde),(sigMask),(wakeup)) ) #define PCR←IOGbl←Close PCR←IOGbl←←Close /* * Initialization * * Called from PCR←IOImpl.c */ extern PCR←ERes PCR←IOGbl←Setup(void); extern PCR←ERes PCR←IOGbl←Run(void); #endif /* ! ←←PCR←IOGbl←h */ /* $Log$ */