Annotation of sys/sys/filedesc.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: filedesc.h,v 1.19 2004/07/22 06:11:10 tedu Exp $ */
! 2: /* $NetBSD: filedesc.h,v 1.14 1996/04/09 20:55:28 cgd Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1990, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. Neither the name of the University nor the names of its contributors
! 17: * may be used to endorse or promote products derived from this software
! 18: * without specific prior written permission.
! 19: *
! 20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 30: * SUCH DAMAGE.
! 31: *
! 32: * @(#)filedesc.h 8.1 (Berkeley) 6/2/93
! 33: */
! 34:
! 35: #include <sys/rwlock.h>
! 36: /*
! 37: * This structure is used for the management of descriptors. It may be
! 38: * shared by multiple processes.
! 39: *
! 40: * A process is initially started out with NDFILE descriptors stored within
! 41: * this structure, selected to be enough for typical applications based on
! 42: * the historical limit of 20 open files (and the usage of descriptors by
! 43: * shells). If these descriptors are exhausted, a larger descriptor table
! 44: * may be allocated, up to a process' resource limit; the internal arrays
! 45: * are then unused. The initial expansion is set to NDEXTENT; each time
! 46: * it runs out, it is doubled until the resource limit is reached. NDEXTENT
! 47: * should be selected to be the biggest multiple of OFILESIZE (see below)
! 48: * that will fit in a power-of-two sized piece of memory.
! 49: */
! 50: #define NDFILE 20
! 51: #define NDEXTENT 50 /* 250 bytes in 256-byte alloc. */
! 52: #define NDENTRIES 32 /* 32 fds per entry */
! 53: #define NDENTRYMASK (NDENTRIES - 1)
! 54: #define NDENTRYSHIFT 5 /* bits per entry */
! 55: #define NDREDUCE(x) (((x) + NDENTRIES - 1) >> NDENTRYSHIFT)
! 56: #define NDHISLOTS(x) (NDREDUCE(NDREDUCE(x)))
! 57: #define NDLOSLOTS(x) (NDHISLOTS(x) << NDENTRYSHIFT)
! 58:
! 59: struct filedesc {
! 60: struct file **fd_ofiles; /* file structures for open files */
! 61: char *fd_ofileflags; /* per-process open file flags */
! 62: struct vnode *fd_cdir; /* current directory */
! 63: struct vnode *fd_rdir; /* root directory */
! 64: int fd_nfiles; /* number of open files allocated */
! 65: u_int *fd_himap; /* each bit points to 32 fds */
! 66: u_int *fd_lomap; /* bitmap of free fds */
! 67: int fd_lastfile; /* high-water mark of fd_ofiles */
! 68: int fd_freefile; /* approx. next free file */
! 69: u_short fd_cmask; /* mask for file creation */
! 70: u_short fd_refcnt; /* reference count */
! 71: struct rwlock fd_lock; /* lock for the file descs */
! 72:
! 73: int fd_knlistsize; /* size of knlist */
! 74: struct klist *fd_knlist; /* list of attached knotes */
! 75: u_long fd_knhashmask; /* size of knhash */
! 76: struct klist *fd_knhash; /* hash table for attached knotes */
! 77: };
! 78:
! 79: /*
! 80: * Basic allocation of descriptors:
! 81: * one of the above, plus arrays for NDFILE descriptors.
! 82: */
! 83: struct filedesc0 {
! 84: struct filedesc fd_fd;
! 85: /*
! 86: * These arrays are used when the number of open files is
! 87: * <= NDFILE, and are then pointed to by the pointers above.
! 88: */
! 89: struct file *fd_dfiles[NDFILE];
! 90: char fd_dfileflags[NDFILE];
! 91: /*
! 92: * There arrays are used when the number of open files is
! 93: * <= 1024, and are then pointed to by the pointers above.
! 94: */
! 95: u_int fd_dhimap[NDENTRIES >> NDENTRYSHIFT];
! 96: u_int fd_dlomap[NDENTRIES];
! 97: };
! 98:
! 99: /*
! 100: * Per-process open flags.
! 101: */
! 102: #define UF_EXCLOSE 0x01 /* auto-close on exec */
! 103:
! 104: /*
! 105: * Storage required per open file descriptor.
! 106: */
! 107: #define OFILESIZE (sizeof(struct file *) + sizeof(char))
! 108:
! 109: #ifdef _KERNEL
! 110: /*
! 111: * Kernel global variables and routines.
! 112: */
! 113: void filedesc_init(void);
! 114: int dupfdopen(struct filedesc *fdp, int indx, int dfd, int mode,
! 115: int error);
! 116: int fdalloc(struct proc *p, int want, int *result);
! 117: void fdexpand(struct proc *);
! 118: int falloc(struct proc *p, struct file **resultfp, int *resultfd);
! 119: struct filedesc *fdinit(struct proc *p);
! 120: struct filedesc *fdshare(struct proc *p);
! 121: struct filedesc *fdcopy(struct proc *p);
! 122: void fdfree(struct proc *p);
! 123: int fdrelease(struct proc *p, int);
! 124: void fdremove(struct filedesc *, int);
! 125: void fdcloseexec(struct proc *);
! 126: struct file *fd_getfile(struct filedesc *, int fd);
! 127:
! 128: int closef(struct file *, struct proc *);
! 129: int getsock(struct filedesc *, int, struct file **);
! 130:
! 131: #define fdplock(fdp) rw_enter_write(&(fdp)->fd_lock)
! 132: #define fdpunlock(fdp) rw_exit_write(&(fdp)->fd_lock)
! 133: #endif
CVSweb