Mailing List Archive

Extend the range abstraction by adding an internal
# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID 65430a8f80d74823be5b96e1383a4eb5e33c137b
# Parent 4937d9f496abc4962ac6597dc0bf48b2aef8a0f7
Extend the range abstraction by adding an internal
insert_range() helper function. Pretty printer uses
the internal abstractions rather than accessing the
linked list directly.

Signed-off-by: Keir Fraser <keir@xensource.com>

diff -r 4937d9f496ab -r 65430a8f80d7 xen/common/rangeset.c
--- a/xen/common/rangeset.c Thu Dec 29 17:16:01 2005
+++ b/xen/common/rangeset.c Thu Dec 29 17:39:50 2005
@@ -32,6 +32,10 @@
unsigned int flags;
};

+/*****************************
+ * Private range functions hide the underlying linked-list implemnetation.
+ */
+
/* Find highest range lower than or containing s. NULL if no such range. */
static struct range *find_range(
struct rangeset *r, unsigned long s)
@@ -66,6 +70,13 @@
return list_entry(x->list.next, struct range, list);
}

+/* Insert range y after range x in r. Insert as first range if x is NULL. */
+static void insert_range(
+ struct rangeset *r, struct range *x, struct range *y)
+{
+ list_add(&y->list, (x != NULL) ? &x->list : &r->range_list);
+}
+
/* Remove a range from its list and free it. */
static void destroy_range(
struct range *x)
@@ -73,6 +84,10 @@
list_del(&x->list);
xfree(x);
}
+
+/*****************************
+ * Core public functions
+ */

int rangeset_add_range(
struct rangeset *r, unsigned long s, unsigned long e)
@@ -99,10 +114,9 @@
x->s = s;
x->e = e;

- list_add(&x->list, (y != NULL) ? &y->list : &r->range_list);
- }
-
- if ( x->e < e )
+ insert_range(r, y, x);
+ }
+ else if ( x->e < e )
x->e = e;
}
else
@@ -165,10 +179,12 @@
rc = -ENOMEM;
goto out;
}
+
y->s = e + 1;
y->e = x->e;
x->e = s - 1;
- list_add(&y->list, &x->list);
+
+ insert_range(r, x, y);
}
else if ( (x->s == s) && (x->e <= e) )
destroy_range(x);
@@ -317,6 +333,10 @@
}
}

+/*****************************
+ * Pretty-printing functions
+ */
+
static void print_limit(struct rangeset *r, unsigned long s)
{
printk((r->flags & RANGESETF_prettyprint_hex) ? "%lx" : "%lu", s);
@@ -332,7 +352,7 @@

printk("%10s {", r->name);

- list_for_each_entry ( x, &r->range_list, list )
+ for ( x = first_range(r); x != NULL; x = next_range(r, x) )
{
if ( nr_printed++ )
printk(",");

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog