diff options
author | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
---|---|---|
committer | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
commit | f07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch) | |
tree | 12b07c7e578fc1a5f53dbfde2632408491ff2a70 /ipc/ipc_entry.h | |
download | gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.tar.gz gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.tar.bz2 gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.zip |
Initial source
Diffstat (limited to 'ipc/ipc_entry.h')
-rw-r--r-- | ipc/ipc_entry.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/ipc/ipc_entry.h b/ipc/ipc_entry.h new file mode 100644 index 00000000..ea0c0a24 --- /dev/null +++ b/ipc/ipc_entry.h @@ -0,0 +1,158 @@ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989 Carnegie Mellon University. + * Copyright (c) 1993,1994 The University of Utah and + * the Computer Systems Laboratory (CSL). + * All rights reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON, THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF + * THIS SOFTWARE IN ITS "AS IS" CONDITION, AND DISCLAIM ANY LIABILITY + * OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF + * THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + * File: ipc/ipc_entry.h + * Author: Rich Draves + * Date: 1989 + * + * Definitions for translation entries, which represent + * tasks' capabilities for ports and port sets. + */ + +#ifndef _IPC_IPC_ENTRY_H_ +#define _IPC_IPC_ENTRY_H_ + +#include <mach/port.h> +#include <mach/kern_return.h> +#include <kern/zalloc.h> +#include <ipc/port.h> +#include <ipc/ipc_table.h> + +/* + * Spaces hold capabilities for ipc_object_t's (ports and port sets). + * Each ipc_entry_t records a capability. Most capabilities have + * small names, and the entries are elements of a table. + * Capabilities can have large names, and a splay tree holds + * those entries. The cutoff point between the table and the tree + * is adjusted dynamically to minimize memory consumption. + * + * The ie_index field of entries in the table implements + * a ordered hash table with open addressing and linear probing. + * This hash table converts (space, object) -> name. + * It is used independently of the other fields. + * + * Free (unallocated) entries in the table have null ie_object + * fields. The ie_bits field is zero except for IE_BITS_GEN. + * The ie_next (ie_request) field links free entries into a free list. + * + * The first entry in the table (index 0) is always free. + * It is used as the head of the free list. + */ + +typedef unsigned int ipc_entry_bits_t; +typedef ipc_table_elems_t ipc_entry_num_t; /* number of entries */ + +typedef struct ipc_entry { + ipc_entry_bits_t ie_bits; + struct ipc_object *ie_object; + union { + mach_port_index_t next; + /*XXX ipc_port_request_index_t request;*/ + unsigned int request; + } index; + union { + mach_port_index_t table; + struct ipc_tree_entry *tree; + } hash; +} *ipc_entry_t; + +#define IE_NULL ((ipc_entry_t) 0) + +#define ie_request index.request +#define ie_next index.next +#define ie_index hash.table + +#define IE_BITS_UREFS_MASK 0x0000ffff /* 16 bits of user-reference */ +#define IE_BITS_UREFS(bits) ((bits) & IE_BITS_UREFS_MASK) + +#define IE_BITS_TYPE_MASK 0x001f0000 /* 5 bits of capability type */ +#define IE_BITS_TYPE(bits) ((bits) & IE_BITS_TYPE_MASK) + +#define IE_BITS_MAREQUEST 0x00200000 /* 1 bit for msg-accepted */ + +#define IE_BITS_COMPAT 0x00400000 /* 1 bit for compatibility */ + +#define IE_BITS_COLLISION 0x00800000 /* 1 bit for collisions */ +#define IE_BITS_RIGHT_MASK 0x007fffff /* relevant to the right */ + +#if PORT_GENERATIONS +#define IE_BITS_GEN_MASK 0xff000000U /* 8 bits for generation */ +#define IE_BITS_GEN(bits) ((bits) & IE_BITS_GEN_MASK) +#define IE_BITS_GEN_ONE 0x01000000 /* low bit of generation */ +#else +#define IE_BITS_GEN_MASK 0 +#define IE_BITS_GEN(bits) 0 +#define IE_BITS_GEN_ONE 0 +#endif + + +typedef struct ipc_tree_entry { + struct ipc_entry ite_entry; + mach_port_t ite_name; + struct ipc_space *ite_space; + struct ipc_tree_entry *ite_lchild; + struct ipc_tree_entry *ite_rchild; +} *ipc_tree_entry_t; + +#define ITE_NULL ((ipc_tree_entry_t) 0) + +#define ite_bits ite_entry.ie_bits +#define ite_object ite_entry.ie_object +#define ite_request ite_entry.ie_request +#define ite_next ite_entry.hash.tree + +extern zone_t ipc_tree_entry_zone; + +#define ite_alloc() ((ipc_tree_entry_t) zalloc(ipc_tree_entry_zone)) +#define ite_free(ite) zfree(ipc_tree_entry_zone, (vm_offset_t) (ite)) + + +extern ipc_entry_t +ipc_entry_lookup(/* ipc_space_t space, mach_port_t name */); + +extern kern_return_t +ipc_entry_get(/* ipc_space_t space, + mach_port_t *namep, ipc_entry_t *entryp */); + +extern kern_return_t +ipc_entry_alloc(/* ipc_space_t space, + mach_port_t *namep, ipc_entry_t *entryp */); + +extern kern_return_t +ipc_entry_alloc_name(/* ipc_space_t space, mach_port_t name, + ipc_entry_t *entryp */); + +extern void +ipc_entry_dealloc(/* ipc_space_t space, mach_port_t name, + ipc_entry_t entry */); + +extern kern_return_t +ipc_entry_grow_table(/* ipc_space_t space */); + +#endif _IPC_IPC_ENTRY_H_ |