ACPICA: Simplify and optimize NsGetNextNode function
authorBob Moore <robert.moore@intel.com>
Thu, 21 May 2009 02:27:51 +0000 (10:27 +0800)
committerLen Brown <len.brown@intel.com>
Wed, 27 May 2009 04:35:50 +0000 (00:35 -0400)
Reduced parameter count and reduced code for this frequently
used function.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/nsalloc.c
drivers/acpi/acpica/nswalk.c
drivers/acpi/acpica/nsxfobj.c

index 46cb5b4..94cdc2b 100644 (file)
@@ -99,10 +99,19 @@ acpi_ns_walk_namespace(acpi_object_type type,
                       acpi_walk_callback user_function,
                       void *context, void **return_value);
 
-struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct acpi_namespace_node
-                                                 *parent, struct acpi_namespace_node
+struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
+                                                 *parent,
+                                                 struct acpi_namespace_node
                                                  *child);
 
+struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
+                                                       struct
+                                                       acpi_namespace_node
+                                                       *parent,
+                                                       struct
+                                                       acpi_namespace_node
+                                                       *child);
+
 /*
  * nsparse - table parsing
  */
index aceb931..efc971a 100644 (file)
@@ -334,9 +334,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
 
                /* Get the next node in this scope (NULL if none) */
 
-               child_node =
-                   acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
-                                         child_node);
+               child_node = acpi_ns_get_next_node(parent_node, child_node);
                if (child_node) {
 
                        /* Found a child node - detach any attached object */
@@ -345,8 +343,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
 
                        /* Check if this node has any children */
 
-                       if (acpi_ns_get_next_node
-                           (ACPI_TYPE_ANY, child_node, NULL)) {
+                       if (child_node->child) {
                                /*
                                 * There is at least one child of this node,
                                 * visit the node
@@ -432,9 +429,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
                 * Get the next child of this parent node. When child_node is NULL,
                 * the first child of the parent is returned
                 */
-               child_node =
-                   acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
-                                         child_node);
+               child_node = acpi_ns_get_next_node(parent_node, child_node);
 
                if (deletion_node) {
                        acpi_ns_delete_children(deletion_node);
@@ -452,8 +447,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
 
                        /* Check if this node has any children */
 
-                       if (acpi_ns_get_next_node
-                           (ACPI_TYPE_ANY, child_node, NULL)) {
+                       if (child_node->child) {
                                /*
                                 * There is at least one child of this node,
                                 * visit the node
index 83e3aa6..35539df 100644 (file)
@@ -52,8 +52,7 @@ ACPI_MODULE_NAME("nswalk")
  *
  * FUNCTION:    acpi_ns_get_next_node
  *
- * PARAMETERS:  Type                - Type of node to be searched for
- *              parent_node         - Parent node whose children we are
+ * PARAMETERS:  parent_node         - Parent node whose children we are
  *                                    getting
  *              child_node          - Previous child that was found.
  *                                    The NEXT child will be returned
@@ -66,27 +65,68 @@ ACPI_MODULE_NAME("nswalk")
  *              within Scope is returned.
  *
  ******************************************************************************/
-struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct acpi_namespace_node
-                                                 *parent_node, struct acpi_namespace_node
+struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
+                                                 *parent_node,
+                                                 struct acpi_namespace_node
                                                  *child_node)
 {
-       struct acpi_namespace_node *next_node = NULL;
-
        ACPI_FUNCTION_ENTRY();
 
        if (!child_node) {
 
                /* It's really the parent's _scope_ that we want */
 
-               next_node = parent_node->child;
+               return parent_node->child;
        }
 
-       else {
-               /* Start search at the NEXT node */
-
-               next_node = acpi_ns_get_next_valid_node(child_node);
+       /*
+        * Get the next node.
+        *
+        * If we are at the end of this peer list, return NULL
+        */
+       if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
+               return NULL;
        }
 
+       /* Otherwise just return the next peer */
+
+       return child_node->peer;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ns_get_next_node_typed
+ *
+ * PARAMETERS:  Type                - Type of node to be searched for
+ *              parent_node         - Parent node whose children we are
+ *                                    getting
+ *              child_node          - Previous child that was found.
+ *                                    The NEXT child will be returned
+ *
+ * RETURN:      struct acpi_namespace_node - Pointer to the NEXT child or NULL if
+ *                                    none is found.
+ *
+ * DESCRIPTION: Return the next peer node within the namespace.  If Handle
+ *              is valid, Scope is ignored.  Otherwise, the first node
+ *              within Scope is returned.
+ *
+ ******************************************************************************/
+
+struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
+                                                       struct
+                                                       acpi_namespace_node
+                                                       *parent_node,
+                                                       struct
+                                                       acpi_namespace_node
+                                                       *child_node)
+{
+       struct acpi_namespace_node *next_node = NULL;
+
+       ACPI_FUNCTION_ENTRY();
+
+       next_node = acpi_ns_get_next_node(parent_node, child_node);
+
+
        /* If any type is OK, we are done */
 
        if (type == ACPI_TYPE_ANY) {
@@ -186,9 +226,7 @@ acpi_ns_walk_namespace(acpi_object_type type,
                /* Get the next node in this scope.  Null if not found */
 
                status = AE_OK;
-               child_node =
-                   acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
-                                         child_node);
+               child_node = acpi_ns_get_next_node(parent_node, child_node);
                if (child_node) {
 
                        /* Found next child, get the type if we are not searching for ANY */
@@ -269,8 +307,7 @@ acpi_ns_walk_namespace(acpi_object_type type,
                         * function has specified that the maximum depth has been reached.
                         */
                        if ((level < max_depth) && (status != AE_CTRL_DEPTH)) {
-                               if (acpi_ns_get_next_node
-                                   (ACPI_TYPE_ANY, child_node, NULL)) {
+                               if (child_node->child) {
 
                                        /* There is at least one child of this node, visit it */
 
index 1c7efc1..dd33d8b 100644 (file)
@@ -268,7 +268,7 @@ acpi_get_next_object(acpi_object_type type,
 
        /* Internal function does the real work */
 
-       node = acpi_ns_get_next_node(type, parent_node, child_node);
+       node = acpi_ns_get_next_node_typed(type, parent_node, child_node);
        if (!node) {
                status = AE_NOT_FOUND;
                goto unlock_and_exit;