|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1991,1990,1989 Carnegie Mellon University ! 28: * All Rights Reserved. ! 29: * ! 30: * Permission to use, copy, modify and distribute this software and its ! 31: * documentation is hereby granted, provided that both the copyright ! 32: * notice and this permission notice appear in all copies of the ! 33: * software, derivative works or modified versions, and any portions ! 34: * thereof, and that both notices appear in supporting documentation. ! 35: * ! 36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 39: * ! 40: * Carnegie Mellon requests users of this software to return to ! 41: * ! 42: * Software Distribution Coordinator or [email protected] ! 43: * School of Computer Science ! 44: * Carnegie Mellon University ! 45: * Pittsburgh PA 15213-3890 ! 46: * ! 47: * any improvements or extensions that they make and grant Carnegie Mellon ! 48: * the rights to redistribute these changes. ! 49: */ ! 50: /* ! 51: */ ! 52: /* ! 53: * File: ipc/ipc_entry.h ! 54: * Author: Rich Draves ! 55: * Date: 1989 ! 56: * ! 57: * Definitions for translation entries, which represent ! 58: * tasks' capabilities for ports and port sets. ! 59: */ ! 60: ! 61: #ifndef _IPC_IPC_ENTRY_H_ ! 62: #define _IPC_IPC_ENTRY_H_ ! 63: ! 64: #include <mach/port.h> ! 65: #include <mach/kern_return.h> ! 66: #include <kern/zalloc.h> ! 67: #include <ipc/port.h> ! 68: #include <ipc/ipc_table.h> ! 69: #include <ipc/ipc_types.h> ! 70: ! 71: /* ! 72: * Spaces hold capabilities for ipc_object_t's. ! 73: * Each ipc_entry_t records a capability. Most capabilities have ! 74: * small names, and the entries are elements of a table. ! 75: * Capabilities can have large names, and a splay tree holds ! 76: * those entries. The cutoff point between the table and the tree ! 77: * is adjusted dynamically to minimize memory consumption. ! 78: * ! 79: * The ie_index field of entries in the table implements ! 80: * a ordered hash table with open addressing and linear probing. ! 81: * This hash table converts (space, object) -> name. ! 82: * It is used independently of the other fields. ! 83: * ! 84: * Free (unallocated) entries in the table have null ie_object ! 85: * fields. The ie_bits field is zero except for IE_BITS_GEN. ! 86: * The ie_next (ie_request) field links free entries into a free list. ! 87: * ! 88: * The first entry in the table (index 0) is always free. ! 89: * It is used as the head of the free list. ! 90: */ ! 91: ! 92: typedef natural_t ipc_entry_bits_t; ! 93: typedef ipc_table_elems_t ipc_entry_num_t; /* number of entries */ ! 94: ! 95: typedef struct ipc_entry { ! 96: struct ipc_object *ie_object; ! 97: ipc_entry_bits_t ie_bits; ! 98: union { ! 99: mach_port_index_t next; /* next in freelist, or... */ ! 100: ipc_table_index_t request; /* dead name request notify */ ! 101: } index; ! 102: union { ! 103: mach_port_index_t table; ! 104: struct ipc_tree_entry *tree; ! 105: } hash; ! 106: } *ipc_entry_t; ! 107: ! 108: #define IE_NULL ((ipc_entry_t) 0) ! 109: ! 110: #define ie_request index.request ! 111: #define ie_next index.next ! 112: #define ie_index hash.table ! 113: ! 114: #define IE_BITS_UREFS_MASK 0x0000ffff /* 16 bits of user-reference */ ! 115: #define IE_BITS_UREFS(bits) ((bits) & IE_BITS_UREFS_MASK) ! 116: ! 117: #define IE_BITS_TYPE_MASK 0x001f0000 /* 5 bits of capability type */ ! 118: #define IE_BITS_TYPE(bits) ((bits) & IE_BITS_TYPE_MASK) ! 119: ! 120: #define IE_BITS_COLLISION 0x00800000 /* 1 bit for collisions */ ! 121: ! 122: ! 123: #ifndef NO_PORT_GEN ! 124: #define IE_BITS_GEN_MASK 0xff000000 /* 8 bits for generation */ ! 125: #define IE_BITS_GEN(bits) ((bits) & IE_BITS_GEN_MASK) ! 126: #define IE_BITS_GEN_ONE 0x04000000 /* low bit of generation */ ! 127: #define IE_BITS_NEW_GEN(old) (((old) + IE_BITS_GEN_ONE) & IE_BITS_GEN_MASK) ! 128: #else ! 129: #define IE_BITS_GEN_MASK 0 ! 130: #define IE_BITS_GEN(bits) 0 ! 131: #define IE_BITS_GEN_ONE 0 ! 132: #define IE_BITS_NEW_GEN(old) (old) ! 133: #endif /* !USE_PORT_GEN */ ! 134: ! 135: ! 136: #define IE_BITS_RIGHT_MASK 0x007fffff /* relevant to the right */ ! 137: ! 138: typedef struct ipc_tree_entry { ! 139: struct ipc_entry ite_entry; ! 140: mach_port_name_t ite_name; ! 141: struct ipc_space *ite_space; ! 142: struct ipc_tree_entry *ite_lchild; ! 143: struct ipc_tree_entry *ite_rchild; ! 144: } *ipc_tree_entry_t; ! 145: ! 146: #define ITE_NULL ((ipc_tree_entry_t) 0) ! 147: ! 148: #define ite_bits ite_entry.ie_bits ! 149: #define ite_object ite_entry.ie_object ! 150: #define ite_request ite_entry.ie_request ! 151: #define ite_next ite_entry.hash.tree ! 152: ! 153: extern zone_t ipc_tree_entry_zone; ! 154: ! 155: #define ite_alloc() ((ipc_tree_entry_t) zalloc(ipc_tree_entry_zone)) ! 156: #define ite_free(ite) zfree(ipc_tree_entry_zone, (vm_offset_t) (ite)) ! 157: ! 158: /* ! 159: * Exported interfaces ! 160: */ ! 161: ! 162: /* Search for entry in a space by name */ ! 163: extern ipc_entry_t ipc_entry_lookup( ! 164: ipc_space_t space, ! 165: mach_port_name_t name); ! 166: ! 167: /* Allocate an entry in a space */ ! 168: extern kern_return_t ipc_entry_get( ! 169: ipc_space_t space, ! 170: mach_port_name_t *namep, ! 171: ipc_entry_t *entryp); ! 172: ! 173: /* Allocate an entry in a space, growing the space if necessary */ ! 174: extern kern_return_t ipc_entry_alloc( ! 175: ipc_space_t space, ! 176: mach_port_name_t *namep, ! 177: ipc_entry_t *entryp); ! 178: ! 179: /* Allocate/find an entry in a space with a specific name */ ! 180: extern kern_return_t ipc_entry_alloc_name( ! 181: ipc_space_t space, ! 182: mach_port_name_t name, ! 183: ipc_entry_t *entryp); ! 184: ! 185: /* Deallocate an entry from a space */ ! 186: extern void ipc_entry_dealloc( ! 187: ipc_space_t space, ! 188: mach_port_name_t name, ! 189: ipc_entry_t entry); ! 190: ! 191: /* Grow the table in a space */ ! 192: extern kern_return_t ipc_entry_grow_table( ! 193: ipc_space_t space, ! 194: int target_size); ! 195: ! 196: #endif /* _IPC_IPC_ENTRY_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.