|
|
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_space.h ! 54: * Author: Rich Draves ! 55: * Date: 1989 ! 56: * ! 57: * Definitions for IPC spaces of capabilities. ! 58: */ ! 59: ! 60: #ifndef _IPC_IPC_SPACE_H_ ! 61: #define _IPC_IPC_SPACE_H_ ! 62: ! 63: ! 64: #include <mach/mach_types.h> ! 65: #include <mach/boolean.h> ! 66: #include <mach/kern_return.h> ! 67: #include <mach/vm_types.h> ! 68: ! 69: #ifdef MACH_KERNEL_PRIVATE ! 70: #include <mach_kdb.h> ! 71: #include <kern/macro_help.h> ! 72: #include <kern/lock.h> ! 73: #include <kern/task.h> ! 74: #include <kern/zalloc.h> ! 75: #include <ipc/ipc_entry.h> ! 76: #include <ipc/ipc_splay.h> ! 77: #include <ipc/ipc_types.h> ! 78: ! 79: /* ! 80: * Every task has a space of IPC capabilities. ! 81: * IPC operations like send and receive use this space. ! 82: * IPC kernel calls manipulate the space of the target task. ! 83: * ! 84: * Every space has a non-NULL is_table with is_table_size entries. ! 85: * A space may have a NULL is_tree. is_tree_small records the ! 86: * number of entries in the tree that, if the table were to grow ! 87: * to the next larger size, would move from the tree to the table. ! 88: * ! 89: * is_growing marks when the table is in the process of growing. ! 90: * When the table is growing, it can't be freed or grown by another ! 91: * thread, because of krealloc/kmem_realloc's requirements. ! 92: * ! 93: */ ! 94: ! 95: typedef natural_t ipc_space_refs_t; ! 96: ! 97: struct ipc_space { ! 98: decl_mutex_data(,is_ref_lock_data) ! 99: ipc_space_refs_t is_references; ! 100: ! 101: decl_mutex_data(,is_lock_data) ! 102: boolean_t is_active; /* is the space alive? */ ! 103: boolean_t is_growing; /* is the space growing? */ ! 104: ipc_entry_t is_table; /* an array of entries */ ! 105: ipc_entry_num_t is_table_size; /* current size of table */ ! 106: struct ipc_table_size *is_table_next; /* info for larger table */ ! 107: struct ipc_splay_tree is_tree; /* a splay tree of entries */ ! 108: ipc_entry_num_t is_tree_total; /* number of entries in the tree */ ! 109: ipc_entry_num_t is_tree_small; /* # of small entries in the tree */ ! 110: ipc_entry_num_t is_tree_hash; /* # of hashed entries in the tree */ ! 111: boolean_t is_fast; /* for is_fast_space() */ ! 112: }; ! 113: ! 114: #define IS_NULL ((ipc_space_t) 0) ! 115: ! 116: extern zone_t ipc_space_zone; ! 117: ! 118: #define is_alloc() ((ipc_space_t) zalloc(ipc_space_zone)) ! 119: #define is_free(is) zfree(ipc_space_zone, (vm_offset_t) (is)) ! 120: ! 121: extern ipc_space_t ipc_space_kernel; ! 122: extern ipc_space_t ipc_space_reply; ! 123: #if DIPC ! 124: extern ipc_space_t ipc_space_remote; ! 125: #endif /* DIPC */ ! 126: #if DIPC || MACH_KDB ! 127: extern ipc_space_t default_pager_space; ! 128: #endif /* DIPC || MACH_KDB */ ! 129: ! 130: #define is_fast_space(is) ((is)->is_fast) ! 131: ! 132: #define is_ref_lock_init(is) mutex_init(&(is)->is_ref_lock_data, \ ! 133: ETAP_IPC_IS_REF) ! 134: ! 135: #define ipc_space_reference_macro(is) \ ! 136: MACRO_BEGIN \ ! 137: mutex_lock(&(is)->is_ref_lock_data); \ ! 138: assert((is)->is_references > 0); \ ! 139: (is)->is_references++; \ ! 140: mutex_unlock(&(is)->is_ref_lock_data); \ ! 141: MACRO_END ! 142: ! 143: #define ipc_space_release_macro(is) \ ! 144: MACRO_BEGIN \ ! 145: ipc_space_refs_t _refs; \ ! 146: \ ! 147: mutex_lock(&(is)->is_ref_lock_data); \ ! 148: assert((is)->is_references > 0); \ ! 149: _refs = --(is)->is_references; \ ! 150: mutex_unlock(&(is)->is_ref_lock_data); \ ! 151: \ ! 152: if (_refs == 0) \ ! 153: is_free(is); \ ! 154: MACRO_END ! 155: ! 156: #define is_lock_init(is) mutex_init(&(is)->is_lock_data, ETAP_IPC_IS) ! 157: ! 158: #define is_read_lock(is) mutex_lock(&(is)->is_lock_data) ! 159: #define is_read_unlock(is) mutex_unlock(&(is)->is_lock_data) ! 160: ! 161: #define is_write_lock(is) mutex_lock(&(is)->is_lock_data) ! 162: #define is_write_lock_try(is) mutex_try(&(is)->is_lock_data) ! 163: #define is_write_unlock(is) mutex_unlock(&(is)->is_lock_data) ! 164: ! 165: #define is_reference(is) ipc_space_reference(is) ! 166: #define is_release(is) ipc_space_release(is) ! 167: ! 168: #define is_write_to_read_lock(is) ! 169: ! 170: #define current_space_fast() (current_task_fast()->itk_space) ! 171: #define current_space() (current_space_fast()) ! 172: ! 173: #else /* !MACH_KERNEL_PRIVATE */ ! 174: ! 175: extern ipc_space_t current_space(void); ! 176: ! 177: #endif /* MACH_KERNEL_PRIVATE */ ! 178: ! 179: /* Take a reference on a space */ ! 180: extern void ipc_space_reference( ! 181: ipc_space_t space); ! 182: ! 183: /* Realase a reference on a space */ ! 184: extern void ipc_space_release( ! 185: ipc_space_t space); ! 186: ! 187: ! 188: /* Create new IPC space */ ! 189: extern kern_return_t ipc_space_create( ! 190: ipc_table_size_t initial, ! 191: ipc_space_t *spacep); ! 192: ! 193: /* Create a special IPC space */ ! 194: extern kern_return_t ipc_space_create_special( ! 195: ipc_space_t *spacep); ! 196: ! 197: /* Mark a space as dead and cleans up the entries*/ ! 198: extern void ipc_space_destroy( ! 199: ipc_space_t space); ! 200: ! 201: #endif /* _IPC_IPC_SPACE_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.