diff options
Diffstat (limited to 'lib/util/idtree_random.c')
-rw-r--r-- | lib/util/idtree_random.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/util/idtree_random.c b/lib/util/idtree_random.c index 80758e74d6d..d22245a7734 100644 --- a/lib/util/idtree_random.c +++ b/lib/util/idtree_random.c @@ -40,7 +40,10 @@ /** allocate a new id randomly in the given range */ -_PUBLIC_ int idr_get_new_random(struct idr_context *idp, void *ptr, int limit) +_PUBLIC_ int idr_get_new_random(struct idr_context *idp, + void *ptr, + int starting_id, + int limit) { int id; @@ -48,12 +51,17 @@ _PUBLIC_ int idr_get_new_random(struct idr_context *idp, void *ptr, int limit) then start randomly in the bottom half of the range. This can only fail if the range is over half full, and finally fallback to any free id */ - id = idr_get_new_above(idp, ptr, 1+(generate_random() % limit), limit); + id = idr_get_new_above( + idp, ptr, starting_id+(generate_random() % limit), limit); if (id == -1) { - id = idr_get_new_above(idp, ptr, 1+(generate_random()%(limit/2)), limit); + id = idr_get_new_above( + idp, + ptr, + starting_id+(generate_random()%(limit/2)), + limit); } if (id == -1) { - id = idr_get_new_above(idp, ptr, 1, limit); + id = idr_get_new_above(idp, ptr, starting_id, limit); } return id; |