diff --git a/examples/soak.c b/examples/soak.c index 209d918..f00acfb 100644 --- a/examples/soak.c +++ b/examples/soak.c @@ -800,8 +800,8 @@ main() // every so often, either ... if (iterations % 1000 == 0) { larger_please:; - const int COUNT = 1024; - // ... add COUNT 4KiB pages, or + size_t COUNT = xorshift32() % 1024 + 513; + // ... add some amount of 4KiB pages, or size_t len = COUNT; // The largest page is at list[1] because this is a reverse sorted list. pgno_t pg = list[0] ? list[1] + 1 : 0; @@ -843,7 +843,7 @@ main() if (list[-1] > INITIAL_AMOUNT) { // ... a fraction of the time, remove COUNT / 2 of 4KiB pages. pgno_t pg; - for (int i = 0; i < COUNT; i++) { + for (size_t i = 0; i < COUNT; i++) { pg = list[list[0] - i]; assert(sparsemap_is_set(map, pg) == true); assert(_sparsemap_set(&map, pg, false) == pg); diff --git a/src/sparsemap.c b/src/sparsemap.c index fc9052d..fe3249c 100644 --- a/src/sparsemap.c +++ b/src/sparsemap.c @@ -423,7 +423,24 @@ __sm_chunk_map_set(__sm_chunk_t *map, size_t idx, bool value, size_t *pos, sm_bi return SM_OK; } -/** @brief Finds the index of the \b n'th bit after \b offset bits with \b value. +/** @brief Merges into the chunk at \b offset all set bits from \b src. + * + * @param[in] map The chunk in question. + * @param[in] offset The fully aligned offset of the chunk to be merged. + */ +void +__sm_chunk_map_merge(sparsemap_t *map, sparsemap_idx_t offset, __sm_chunk_t src) +{ + size_t capacity = __sm_chunk_map_get_capacity(&src); + for (sparsemap_idx_t j = 0; j < capacity; j++, offset++) { + if (__sm_chunk_map_is_set(&src, j)) { + sparsemap_set(map, offset, true); + } + } +} + +/** @brief Finds the index of the \b n'th bit after \b offset bits with \b + * value. * * Scans the chunk \b map until after \b offset bits (of any value) have * passed and then begins counting the bits that match \b value looking @@ -797,6 +814,7 @@ __sm_get_size_impl(sparsemap_t *map) return SM_SIZEOF_OVERHEAD + p - start; } +#if 0 /** @brief Aligns to SM_BITS_PER_VECTOR a given index \b idx. * * @param[in] idx The index to align. @@ -808,6 +826,7 @@ __sm_get_aligned_offset(size_t idx) const size_t capacity = SM_BITS_PER_VECTOR; return (idx / capacity) * capacity; } +#endif /** @brief Aligns to SM_CHUNK_MAP_CAPACITY a given index \b idx. * @@ -1082,7 +1101,7 @@ sparsemap_set(sparsemap_t *map, sparsemap_idx_t idx, bool value) __sm_append_data(map, &buf[0], sizeof(buf)); uint8_t *p = __sm_get_chunk_map_data(map, 0); - *(sm_idx_t *)p = __sm_get_fully_aligned_offset(idx); //TODO was not fully aligned before... why? + *(sm_idx_t *)p = __sm_get_fully_aligned_offset(idx); // TODO was not fully aligned before... why? __sm_set_chunk_map_count(map, 1); @@ -1242,17 +1261,6 @@ sparsemap_scan(sparsemap_t *map, void (*scanner)(sm_idx_t[], size_t), size_t ski } } -void -__sm_chunk_map_merge(sparsemap_t *map, sparsemap_idx_t offset, __sm_chunk_t src) -{ - size_t capacity = __sm_chunk_map_get_capacity(&src); - for (sparsemap_idx_t j = 0; j < capacity; j++, offset++) { - if (__sm_chunk_map_is_set(&src, j)) { - sparsemap_set(map, offset, true); - } - } -} - void sparsemap_merge(sparsemap_t *map, sparsemap_t *other) {