X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_multitree.c;h=309d1a00be60eed0e68bc9cbb385070f23e43032;hb=3a64514e2fbdb79da57b289fc94b336b78046ba2;hp=5c9adb735c05df4d14cf281bb5017d51cf247960;hpb=374b2d6d22a0e0dc6ed8d3d628e635ab935072e0;p=palacios.git diff --git a/palacios/src/palacios/vmm_multitree.c b/palacios/src/palacios/vmm_multitree.c index 5c9adb7..309d1a0 100644 --- a/palacios/src/palacios/vmm_multitree.c +++ b/palacios/src/palacios/vmm_multitree.c @@ -57,25 +57,32 @@ struct v3_mtree * v3_mtree_create_node(struct v3_mtree * root, char * name) { struct v3_mtree * ret = NULL; + PrintDebug("Creating Node %s\n", name); + memset(node, 0, sizeof(struct v3_mtree)); strncpy(node->name, name, 50); if ((ret = __insert_mtree_node(root, node))) { + PrintError("Insertion failure\n"); V3_Free(node); return NULL; } + PrintDebug("Node (%s)=%p, root=%p, root->child=%p\n", node->name, node, root, root->child.rb_node); v3_rb_insert_color(&(node->tree_node), &(root->child)); + PrintDebug("balanced\n"); + return node; } struct v3_mtree * v3_mtree_create_subtree(struct v3_mtree * root, char * name) { - struct v3_mtree * node = v3_mtree_create_node(root, name); + struct v3_mtree * node = NULL; PrintDebug("Creating Subtree %s\n", name); + node = v3_mtree_create_node(root, name); if (node == NULL) { return NULL; @@ -89,10 +96,10 @@ struct v3_mtree * v3_mtree_create_subtree(struct v3_mtree * root, char * name) { struct v3_mtree * v3_mtree_create_value(struct v3_mtree * root, char * name, uint64_t size, void * value) { - struct v3_mtree * node = v3_mtree_create_node(root, name); - - PrintDebug("Creating value %s\n", name); + struct v3_mtree * node = NULL; + PrintDebug("Creating value %s\n", name); + node = v3_mtree_create_node(root, name); if (node == NULL) { return NULL; @@ -153,3 +160,24 @@ struct v3_mtree * v3_mtree_find_value(struct v3_mtree * root, char * name) { return node; } + + +struct v3_mtree * v3_mtree_first_child(struct v3_mtree * root) { + struct rb_node * node = v3_rb_first(&(root->child)); + + if (node == NULL) { + return NULL; + } + + return rb_entry(node, struct v3_mtree, tree_node); +} + + +struct v3_mtree * v3_mtree_next_node(struct v3_mtree * node) { + struct rb_node * next_node = v3_rb_next(&(node->tree_node)); + + if (next_node == NULL) { + return NULL; + } + return rb_entry(next_node, struct v3_mtree, tree_node); +}