summaryrefslogtreecommitdiff
path: root/ipc/ipc_entry.h
diff options
context:
space:
mode:
authorThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
committerThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
commitf07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch)
tree12b07c7e578fc1a5f53dbfde2632408491ff2a70 /ipc/ipc_entry.h
Initial source
Diffstat (limited to 'ipc/ipc_entry.h')
-rw-r--r--ipc/ipc_entry.h158
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_