/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * * PCR - I/O local (per-thread) descriptor support * */ #ifndef ←←PCR←IOLcl←h #define ←←PCR←IOLcl←h 1 #include <config/PCR←StdTypes.h> #include <th/PCR←ThData.h> #include <io/PCR←IOGbl.h> #include <limits.h> typedef volatile struct PCR←IOLcl←DERep * PCR←IOLcl←DEPtr; struct PCR←IOLcl←DERep { /* global fildes (>0) or empty (0) */ PCR←ERes lde←gfd; /* per-descriptor data for fcntl */ int lde←fcntlFD; }; typedef volatile struct PCR←IOLcl←DERep PCR←IOLcl←DE; #define PCR←IOLcl←DE←null { 0, 0 } typedef volatile struct PCR←IOLcl←DataRep * PCR←IOLcl←DataPtr; struct PCR←IOLcl←DataRep { /* per-thread working directory */ const char *ld←wd; /* per-thread umask */ mode←t ld←umask; /* number of open files */ int ld←nOpen; /* data per open file */ PCR←IOLcl←DE ld←lde[PCR←POSIX←OPEN←MAX]; }; typedef struct PCR←IOLcl←DataRep PCR←IOLcl←Data; #define PCR←IOLcl←ld (*( (PCR←IOLcl←Data **) \ (&( PCR←ThData←Get()->td←←ioData )) )) extern PCR←IOLcl←DEPtr PCR←IOLcl←DEPtr←FromFD(int fd); #define PCR←IOLcl←DEPtr←←FromFD(fd) (&(PCR←IOLcl←ld->ld←lde[fd])) #define PCR←IOLcl←DEPtr←FromFD PCR←IOLcl←DEPtr←←FromFD extern int PCR←IOLcl←DEPtr←ToFD(PCR←IOLcl←DEPtr lde); #define PCR←IOLcl←DEPtr←←ToFD(lde) (\ (lde) - PCR←IOLcl←DEPtr←←FromFD(0) ) #define PCR←IOLcl←DEPtr←ToFD PCR←IOLcl←DEPtr←←ToFD extern int PCR←IOLcl←DEPtr←ToGFD(PCR←IOLcl←DEPtr lde); #define PCR←IOLcl←DEPtr←←ToGFD(lde) (\ (lde)->lde←gfd ) #define PCR←IOLcl←DEPtr←ToGFD PCR←IOLcl←DEPtr←←ToGFD /* For internal use -- doesn't bump ref count. */ extern PCR←IOLcl←DEPtr PCR←IOLcl←FindUnusedDEPtr(PCR←IOLcl←DEPtr lde); /* Return an unused local descriptor entry, with fildes value >= lde if lde is not NIL. Return NIL if none available. Not reliable if signal might be delivered. */ extern void PCR←IOLcl←AdjustNOpen(int delta); #define PCR←IOLcl←←AdjustNOpen(delta) {\ PCR←IOLcl←ld->ld←nOpen += (delta); } #define PCR←IOLcl←AdjustNOpen PCR←IOLcl←←AdjustNOpen /* Adjust count of open local descriptors. */ /* * Initialization * * Called from PCR←IOImpl.c */ extern PCR←ERes PCR←IOLcl←Setup(void); extern PCR←ERes PCR←IOLcl←Run(void); #endif /* ! ←←PCR←IOLcl←h */ /* $Log$ */