From: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
To: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 4/4] prio_tree: introduce prio_set_parent
Date: Tue, 14 Feb 2012 17:02:02 +0800 [thread overview]
Message-ID: <4F3A230A.20301@linux.vnet.ibm.com> (raw)
In-Reply-To: <4F3A2285.7060700@linux.vnet.ibm.com>
Introduce prio_set_parent to abstraction the operation which
used to attach the node to its parent
Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
---
lib/prio_tree.c | 47 ++++++++++++++++++++++-------------------------
1 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/lib/prio_tree.c b/lib/prio_tree.c
index 928482b..8d443af 100644
--- a/lib/prio_tree.c
+++ b/lib/prio_tree.c
@@ -85,6 +85,17 @@ static inline unsigned long prio_tree_maxindex(unsigned int bits)
return index_bits_to_maxindex[bits - 1];
}
+static void prio_set_parent(struct prio_tree_node *parent,
+ struct prio_tree_node *child, bool left)
+{
+ if (left)
+ parent->left = child;
+ else
+ parent->right = child;
+
+ child->parent = parent;
+}
+
/*
* Extend a priority search tree so that it can store a node with heap_index
* max_heap_index. In the worst case, this algorithm takes O((log n)^2).
@@ -113,15 +124,12 @@ static struct prio_tree_node *prio_tree_expand(struct prio_tree_root *root,
prio_tree_remove(root, root->prio_tree_node);
INIT_PRIO_TREE_NODE(tmp);
- prev->left = tmp;
- tmp->parent = prev;
+ prio_set_parent(prev, tmp, true);
prev = tmp;
}
- if (!prio_tree_empty(root)) {
- prev->left = root->prio_tree_node;
- prev->left->parent = prev;
- }
+ if (!prio_tree_empty(root))
+ prio_set_parent(prev, root->prio_tree_node, true);
root->prio_tree_node = node;
return node;
@@ -142,23 +150,14 @@ struct prio_tree_node *prio_tree_replace(struct prio_tree_root *root,
* and does not help much to improve performance (IMO).
*/
root->prio_tree_node = node;
- } else {
- node->parent = old->parent;
- if (old->parent->left == old)
- old->parent->left = node;
- else
- old->parent->right = node;
- }
+ } else
+ prio_set_parent(old->parent, node, old->parent->left == old);
- if (!prio_tree_left_empty(old)) {
- node->left = old->left;
- old->left->parent = node;
- }
+ if (!prio_tree_left_empty(old))
+ prio_set_parent(node, old->left, true);
- if (!prio_tree_right_empty(old)) {
- node->right = old->right;
- old->right->parent = node;
- }
+ if (!prio_tree_right_empty(old))
+ prio_set_parent(node, old->right, false);
return old;
}
@@ -218,16 +217,14 @@ struct prio_tree_node *prio_tree_insert(struct prio_tree_root *root,
if (index & mask) {
if (prio_tree_right_empty(cur)) {
INIT_PRIO_TREE_NODE(node);
- cur->right = node;
- node->parent = cur;
+ prio_set_parent(cur, node, false);
return res;
} else
cur = cur->right;
} else {
if (prio_tree_left_empty(cur)) {
INIT_PRIO_TREE_NODE(node);
- cur->left = node;
- node->parent = cur;
+ prio_set_parent(cur, node, true);
return res;
} else
cur = cur->left;
--
1.7.7.6
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-02-14 9:02 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-14 8:59 [PATCH 1/4] prio_tree: remove unnecessary code in prio_tree_replace Xiao Guangrong
2012-02-14 9:00 ` [PATCH 2/4] prio_tree: cleanup prio_tree_left/prio_tree_right Xiao Guangrong
2012-02-14 9:01 ` [PATCH 3/4] prio_tree: simplify prio_tree_expand Xiao Guangrong
2012-02-14 9:02 ` Xiao Guangrong [this message]
2012-02-15 0:19 ` [PATCH 1/4] prio_tree: remove unnecessary code in prio_tree_replace Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F3A230A.20301@linux.vnet.ibm.com \
--to=xiaoguangrong@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox