summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-04-01 17:17:01 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-05-20 11:08:29 +0200
commit4934e7c3735dbd25953c922a1327a875f47046a4 (patch)
tree5121c579857d27fc5d83e8536ed21d83b9d38307
parent77b3b60aaee2382142dc7ed50e5b36664cdb21bc (diff)
ipc: inline key ipc entry lookup functions
Declare functions looking up IPC entries that were previously inlined manually with `static inline' so that they will be inlined into the fast paths by the compiler. * ipc/ipc_entry.c (ipc_entry_lookup, ipc_entry_get, ipc_entry_dealloc): Move functions... * ipc/ipc_space.h: ... here, and declare them as `static inline'. * ipc/ipc_entry.h: Drop associated declarations.
-rw-r--r--ipc/ipc_entry.c119
-rw-r--r--ipc/ipc_entry.h9
-rw-r--r--ipc/ipc_space.h120
3 files changed, 120 insertions, 128 deletions
diff --git a/ipc/ipc_entry.c b/ipc/ipc_entry.c
index 2d6e665..a5fe319 100644
--- a/ipc/ipc_entry.c
+++ b/ipc/ipc_entry.c
@@ -52,93 +52,6 @@
struct kmem_cache ipc_entry_cache;
/*
- * Routine: ipc_entry_lookup
- * Purpose:
- * Searches for an entry, given its name.
- * Conditions:
- * The space must be read or write locked throughout.
- * The space must be active.
- */
-
-ipc_entry_t
-ipc_entry_lookup(
- ipc_space_t space,
- mach_port_t name)
-{
- ipc_entry_t entry;
-
- assert(space->is_active);
- entry = rdxtree_lookup(&space->is_map, (rdxtree_key_t) name);
- if (entry != IE_NULL
- && IE_BITS_TYPE(entry->ie_bits) == MACH_PORT_TYPE_NONE)
- entry = NULL;
- assert((entry == IE_NULL) || IE_BITS_TYPE(entry->ie_bits));
- return entry;
-}
-
-/*
- * Routine: ipc_entry_get
- * Purpose:
- * Tries to allocate an entry out of the space.
- * Conditions:
- * The space is write-locked and active throughout.
- * An object may be locked. Will not allocate memory.
- * Returns:
- * KERN_SUCCESS A free entry was found.
- * KERN_NO_SPACE No entry allocated.
- */
-
-kern_return_t
-ipc_entry_get(
- ipc_space_t space,
- mach_port_t *namep,
- ipc_entry_t *entryp)
-{
- mach_port_t new_name;
- ipc_entry_t free_entry;
-
- assert(space->is_active);
-
- /* Get entry from the free list. */
- free_entry = space->is_free_list;
- if (free_entry == IE_NULL)
- return KERN_NO_SPACE;
-
- space->is_free_list = free_entry->ie_next_free;
- space->is_free_list_size -= 1;
-
- /*
- * Initialize the new entry. We need only
- * increment the generation number and clear ie_request.
- */
-
- {
- mach_port_gen_t gen;
-
- assert((free_entry->ie_bits &~ IE_BITS_GEN_MASK) == 0);
- gen = free_entry->ie_bits + IE_BITS_GEN_ONE;
- free_entry->ie_bits = gen;
- free_entry->ie_request = 0;
- new_name = MACH_PORT_MAKE(free_entry->ie_name, gen);
- }
-
- /*
- * The new name can't be MACH_PORT_NULL because index
- * is non-zero. It can't be MACH_PORT_DEAD because
- * the table isn't allowed to grow big enough.
- * (See comment in ipc/ipc_table.h.)
- */
-
- assert(MACH_PORT_VALID(new_name));
- assert(free_entry->ie_object == IO_NULL);
-
- space->is_size += 1;
- *namep = new_name;
- *entryp = free_entry;
- return KERN_SUCCESS;
-}
-
-/*
* Routine: ipc_entry_alloc
* Purpose:
* Allocate an entry out of the space.
@@ -293,38 +206,6 @@ ipc_entry_alloc_name(
return KERN_SUCCESS;
}
-/*
- * Routine: ipc_entry_dealloc
- * Purpose:
- * Deallocates an entry from a space.
- * Conditions:
- * The space must be write-locked throughout.
- * The space must be active.
- */
-
-void
-ipc_entry_dealloc(
- ipc_space_t space,
- mach_port_t name,
- ipc_entry_t entry)
-{
- assert(space->is_active);
- assert(entry->ie_object == IO_NULL);
- assert(entry->ie_request == 0);
-
- if (space->is_free_list_size < IS_FREE_LIST_SIZE_LIMIT) {
- space->is_free_list_size += 1;
- entry->ie_bits &= IE_BITS_GEN_MASK;
- entry->ie_next_free = space->is_free_list;
- space->is_free_list = entry;
- } else {
- rdxtree_remove(&space->is_map, (rdxtree_key_t) name);
- ie_free(entry);
- }
- space->is_size -= 1;
-}
-
-
#if MACH_KDB
#include <ddb/db_output.h>
#include <kern/task.h>
diff --git a/ipc/ipc_entry.h b/ipc/ipc_entry.h
index 5c1f8fd..b429984 100644
--- a/ipc/ipc_entry.h
+++ b/ipc/ipc_entry.h
@@ -96,21 +96,12 @@ extern struct kmem_cache ipc_entry_cache;
#define ie_alloc() ((ipc_entry_t) kmem_cache_alloc(&ipc_entry_cache))
#define ie_free(e) kmem_cache_free(&ipc_entry_cache, (vm_offset_t) (e))
-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);
-
ipc_entry_t
db_ipc_object_by_name(
task_t task,
diff --git a/ipc/ipc_space.h b/ipc/ipc_space.h
index 20b9d57..58fe47c 100644
--- a/ipc/ipc_space.h
+++ b/ipc/ipc_space.h
@@ -137,6 +137,126 @@ kern_return_t ipc_space_create(ipc_table_size_t, ipc_space_t *);
kern_return_t ipc_space_create_special(struct ipc_space **);
void ipc_space_destroy(struct ipc_space *);
+/* IPC entry lookups. */
+
+/*
+ * Routine: ipc_entry_lookup
+ * Purpose:
+ * Searches for an entry, given its name.
+ * Conditions:
+ * The space must be read or write locked throughout.
+ * The space must be active.
+ */
+
+static inline ipc_entry_t
+ipc_entry_lookup(
+ ipc_space_t space,
+ mach_port_t name)
+{
+ ipc_entry_t entry;
+
+ assert(space->is_active);
+ entry = rdxtree_lookup(&space->is_map, (rdxtree_key_t) name);
+ if (entry != IE_NULL
+ && IE_BITS_TYPE(entry->ie_bits) == MACH_PORT_TYPE_NONE)
+ entry = NULL;
+ assert((entry == IE_NULL) || IE_BITS_TYPE(entry->ie_bits));
+ return entry;
+}
+
+/*
+ * Routine: ipc_entry_get
+ * Purpose:
+ * Tries to allocate an entry out of the space.
+ * Conditions:
+ * The space is write-locked and active throughout.
+ * An object may be locked. Will not allocate memory.
+ * Returns:
+ * KERN_SUCCESS A free entry was found.
+ * KERN_NO_SPACE No entry allocated.
+ */
+
+static inline kern_return_t
+ipc_entry_get(
+ ipc_space_t space,
+ mach_port_t *namep,
+ ipc_entry_t *entryp)
+{
+ mach_port_t new_name;
+ ipc_entry_t free_entry;
+
+ assert(space->is_active);
+
+ /* Get entry from the free list. */
+ free_entry = space->is_free_list;
+ if (free_entry == IE_NULL)
+ return KERN_NO_SPACE;
+
+ space->is_free_list = free_entry->ie_next_free;
+ space->is_free_list_size -= 1;
+
+ /*
+ * Initialize the new entry. We need only
+ * increment the generation number and clear ie_request.
+ */
+
+ {
+ mach_port_gen_t gen;
+
+ assert((free_entry->ie_bits &~ IE_BITS_GEN_MASK) == 0);
+ gen = free_entry->ie_bits + IE_BITS_GEN_ONE;
+ free_entry->ie_bits = gen;
+ free_entry->ie_request = 0;
+ new_name = MACH_PORT_MAKE(free_entry->ie_name, gen);
+ }
+
+ /*
+ * The new name can't be MACH_PORT_NULL because index
+ * is non-zero. It can't be MACH_PORT_DEAD because
+ * the table isn't allowed to grow big enough.
+ * (See comment in ipc/ipc_table.h.)
+ */
+
+ assert(MACH_PORT_VALID(new_name));
+ assert(free_entry->ie_object == IO_NULL);
+
+ space->is_size += 1;
+ *namep = new_name;
+ *entryp = free_entry;
+ return KERN_SUCCESS;
+}
+
+/*
+ * Routine: ipc_entry_dealloc
+ * Purpose:
+ * Deallocates an entry from a space.
+ * Conditions:
+ * The space must be write-locked throughout.
+ * The space must be active.
+ */
+
+static inline void
+ipc_entry_dealloc(
+ ipc_space_t space,
+ mach_port_t name,
+ ipc_entry_t entry)
+{
+ assert(space->is_active);
+ assert(entry->ie_object == IO_NULL);
+ assert(entry->ie_request == 0);
+
+ if (space->is_free_list_size < IS_FREE_LIST_SIZE_LIMIT) {
+ space->is_free_list_size += 1;
+ entry->ie_bits &= IE_BITS_GEN_MASK;
+ entry->ie_next_free = space->is_free_list;
+ space->is_free_list = entry;
+ } else {
+ rdxtree_remove(&space->is_map, (rdxtree_key_t) name);
+ ie_free(entry);
+ }
+ space->is_size -= 1;
+}
+
/* Reverse lookups. */
/* Cast a pointer to a suitable key. */