/* 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 #include #include #include 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$ */