bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH gnumach 6/6] ipc: inline key ipc entry lookup functions


From: Justus Winter
Subject: [PATCH gnumach 6/6] ipc: inline key ipc entry lookup functions
Date: Tue, 19 May 2015 17:39:04 +0200

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.
---
 ipc/ipc_entry.c | 119 -------------------------------------------------------
 ipc/ipc_entry.h |   9 -----
 ipc/ipc_space.h | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 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.  */
-- 
2.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]