diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-12-29 18:16:01 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-12-29 18:16:01 +0100 |
commit | 9e1d90563dfc38b901a354b0e752408f076b6d68 (patch) | |
tree | ab553de4739d02f958548592f5b8cbbe681b1fd0 | |
parent | ff6d5dac81779ba083e62718fbacbbd70f2b98aa (diff) | |
download | xen-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.c | 45 |
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); } |