aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-12-29 18:16:01 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-12-29 18:16:01 +0100
commit9e1d90563dfc38b901a354b0e752408f076b6d68 (patch)
treeab553de4739d02f958548592f5b8cbbe681b1fd0
parentff6d5dac81779ba083e62718fbacbbd70f2b98aa (diff)
downloadxen-9e1d90563dfc38b901a354b0e752408f076b6d68.tar.gz
xen-9e1d90563dfc38b901a354b0e752408f076b6d68.tar.bz2
xen-9e1d90563dfc38b901a354b0e752408f076b6d68.zip
Add a little more internal abstraction to the rangeset
library, avoiding direct interaction with the linked-list structure. Signed-off-by: Keir Fraser <keir@xensource.com>
-rw-r--r--xen/common/rangeset.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c
index 8d4e732fbd..35bdb3f656 100644
--- a/xen/common/rangeset.c
+++ b/xen/common/rangeset.c
@@ -28,7 +28,7 @@ struct rangeset {
/* Pretty-printing name. */
char name[32];
- /* RANGESETF_??? */
+ /* RANGESETF flags. */
unsigned int flags;
};
@@ -48,6 +48,24 @@ static struct range *find_range(
return x;
}
+/* Return the lowest range in the set r, or NULL if r is empty. */
+static struct range *first_range(
+ struct rangeset *r)
+{
+ if ( list_empty(&r->range_list) )
+ return NULL;
+ return list_entry(r->range_list.next, struct range, list);
+}
+
+/* Return range following x in ascending order, or NULL if x is the highest. */
+static struct range *next_range(
+ struct rangeset *r, struct range *x)
+{
+ if ( x->list.next == &r->range_list )
+ return NULL;
+ return list_entry(x->list.next, struct range, list);
+}
+
/* Remove a range from its list and free it. */
static void destroy_range(
struct range *x)
@@ -91,12 +109,12 @@ int rangeset_add_range(
{
if ( x == NULL )
{
- x = list_entry(r->range_list.next, struct range, list);
+ x = first_range(r);
x->s = s;
}
else if ( (x->e < s) && ((x->e + 1) != s) )
{
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
x->s = s;
}
@@ -104,15 +122,15 @@ int rangeset_add_range(
for ( ; ; )
{
- y = list_entry(x->list.next, struct range, list);
- if ( (x->list.next == &r->range_list) || (y->e > x->e) )
+ y = next_range(r, x);
+ if ( (y == NULL) || (y->e > x->e) )
break;
destroy_range(y);
}
}
- y = list_entry(x->list.next, struct range, list);
- if ( (x->list.next != &r->range_list) && ((x->e + 1) == y->s) )
+ y = next_range(r, x);
+ if ( (y != NULL) && ((x->e + 1) == y->s) )
{
x->e = y->e;
destroy_range(y);
@@ -162,18 +180,18 @@ int rangeset_remove_range(
else
{
if ( x == NULL )
- x = list_entry(r->range_list.next, struct range, list);
+ x = first_range(r);
if ( x->s < s )
{
x->e = s - 1;
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
}
while ( x != y )
{
t = x;
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
destroy_range(t);
}
@@ -257,6 +275,8 @@ struct rangeset *rangeset_new(
void rangeset_destroy(
struct rangeset *r)
{
+ struct range *x;
+
if ( r == NULL )
return;
@@ -267,11 +287,8 @@ void rangeset_destroy(
spin_unlock(&r->domain->rangesets_lock);
}
- while ( !list_empty(&r->range_list) )
- {
- struct range *x = list_entry(r->range_list.next, struct range, list);
+ while ( (x = first_range(r)) != NULL )
destroy_range(x);
- }
xfree(r);
}