commit - fb5b9d5a63582091c4d5483cdb90c37ed0846329
commit + f831532b96ca120d766ce7c8ee00fdd5a0d7b415
blob - 7d98296142abd2f7a34aef5776b35c41a97a36d0
blob + a64e2b70f7d72a371e595432714264b0131f81a6
--- lib/got_lib_object_idset.h
+++ lib/got_lib_object_idset.h
void *got_object_idset_get(struct got_object_idset *, struct got_object_id *);
const struct got_error *got_object_idset_remove(void **,
struct got_object_idset *, struct got_object_id *);
-const struct got_error *got_object_idset_remove_random(void **,
- struct got_object_idset *);
int got_object_idset_contains(struct got_object_idset *,
struct got_object_id *);
void got_object_idset_for_each(struct got_object_idset *,
blob - 56035401c75a86173b08407b67496f8f59f81183
blob + 75d05734bd36c395981ed8794bc7f7467ed71028
--- lib/object_idset.c
+++ lib/object_idset.c
return got_error(GOT_ERR_NO_OBJ);
}
-const struct got_error *
-got_object_idset_remove_random(void **data, struct got_object_idset *set)
-{
- struct got_object_idset_element *entry, *tmp;
- int i, n, totelem;
-
- if (data)
- *data = NULL;
-
- if (set->totelem == 0)
- return got_error(GOT_ERR_NO_OBJ);
-
- /* Pick a random element index across all lists. */
- if (set->totelem == 1)
- n = 0;
- else
- n = arc4random_uniform(set->totelem);
-
- totelem = 0;
- for (i = 0; i < nitems(set->entries); i++) {
- /* Skip lists which don't contain the element we picked. */
- totelem += set->nelem[i];
- if (totelem == 0 || n > totelem - 1) {
- n -= set->nelem[i];
- continue;
- }
- TAILQ_FOREACH_SAFE(entry, &set->entries[i], entry, tmp) {
- if (n == 0) {
- TAILQ_REMOVE(&set->entries[i], entry, entry);
- if (data)
- *data = entry->data;
- free(entry);
- set->nelem[i]--;
- set->totelem--;
- return NULL;
- }
- n--;
- }
- }
-
- return got_error(GOT_ERR_NO_OBJ);
-}
-
int
got_object_idset_contains(struct got_object_idset *set,
struct got_object_id *id)