This commit is contained in:
Gregory Burd 2024-05-03 16:03:09 -04:00
parent ffc762a796
commit 2afbfa946e
3 changed files with 28 additions and 16 deletions

View file

@ -5,9 +5,9 @@ SHARED_LIB = libsparsemap.so
LIBS = -lm
#CFLAGS = -Wall -Wextra -Wpedantic -Of -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -Wall -Wextra -Wpedantic -Og -g -std=c11 -Iinclude/ -fPIC $(LIBS)
CFLAGS = -Wall -Wextra -Wpedantic -Og -g -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -DSPARSEMAP_DIAGNOSTIC -DDEBUG -Wall -Wextra -Wpedantic -O0 -g -std=c11 -Iinclude/ -fPIC $(LIBS)
CFLAGS = -DSPARSEMAP_DIAGNOSTIC -DDEBUG -Wall -Wextra -Wpedantic -Ofast -g -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -DSPARSEMAP_DIAGNOSTIC -DDEBUG -Wall -Wextra -Wpedantic -Ofast -g -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -Wall -Wextra -Wpedantic -Og -g -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -Wall -Wextra -Wpedantic -Ofast -g -std=c11 -Iinclude/ -fPIC $(LIBS)
#CFLAGS = -DSPARSEMAP_DIAGNOSTIC -DDEBUG -Wall -Wextra -Wpedantic -Og -g -fsanitize=address,leak,object-size,pointer-compare,pointer-subtract,null,return,bounds,pointer-overflow,undefined -fsanitize-address-use-after-scope -std=c11 -Iinclude/ -fPIC $(LIBS)
@ -39,16 +39,16 @@ $(SHARED_LIB): $(OBJS)
examples: $(STATIC_LIB) $(EXAMPLES) $(TEST_OBJS)
soak: tests/soak.c
tests/soak
mls: examples/mls
test: $(TESTS)
tests: $(TESTS)
check: test
test: tests
env ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./tests/test
soak: tests
env ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./tests/soak
tests/test: $(TEST_OBJS) $(LIB_OBJS) $(STATIC_LIB)
$(CC) $^ -o $@ $(TEST_FLAGS)
@ -76,19 +76,19 @@ examples/%.o: examples/%.c
$(CC) $(CFLAGS) -c -o $@ $^
examples/ex_1: $(LIB_OBJS) examples/ex_1.o $(STATIC_LIB)
$(CC) $^ -o $@ $(CFLAGS) $(TEST_FLAGS)
$(CC) $^ -o $@ $(TEST_FLAGS)
examples/ex_2: $(LIB_OBJS) examples/ex_2.o $(STATIC_LIB)
$(CC) $^ -o $@ $(CFLAGS) $(TEST_FLAGS)
$(CC) $^ -o $@ $(TEST_FLAGS)
examples/ex_3: $(LIB_OBJS) examples/ex_3.o $(STATIC_LIB)
$(CC) $^ -o $@ $(CFLAGS) $(TEST_FLAGS)
$(CC) $^ -o $@ $(TEST_FLAGS)
examples/ex_4: $(LIB_OBJS) examples/ex_4.o $(STATIC_LIB)
$(CC) $^ -o $@ $(CFLAGS) $(TEST_FLAGS)
$(CC) $^ -o $@ $(TEST_FLAGS)
tests/soak: $(LIB_OBJS) tests/soak.o $(STATIC_LIB)
$(CC) $^ -o $@ $(CFLAGS) $(TEST_FLAGS)
$(CC) $^ -o $@ $(TEST_FLAGS)
todo:
rg -i 'todo|gsb|abort'

View file

@ -263,8 +263,10 @@ void sparsemap_scan(sparsemap_t *map, void (*scanner)(sm_idx_t vec[], size_t n,
*
* @param[in] map The sparsemap reference.
* @param[in] other The bitmap to merge into \b map.
* @returns 0 on success, -1 and sets errno to ENOSPC when the merge might
* require more space than available.
*/
void sparsemap_merge(sparsemap_t *map, sparsemap_t *other);
int sparsemap_merge(sparsemap_t *map, sparsemap_t *other);
/** @brief Splits the bitmap by assigning all bits starting at \b offset to the
* \b other bitmap while removing them from \b map.

View file

@ -821,6 +821,7 @@ __sm_get_size_impl(sparsemap_t *map)
return SM_SIZEOF_OVERHEAD + p - start;
}
#ifdef DIAGNOSTIC
/** @brief Aligns to SM_BITS_PER_VECTOR a given index \b idx.
*
* @param[in] idx The index to align.
@ -832,6 +833,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.
*
@ -1264,13 +1266,20 @@ sparsemap_scan(sparsemap_t *map, void (*scanner)(sm_idx_t[], size_t, void *aux),
}
}
void
int
sparsemap_merge(sparsemap_t *map, sparsemap_t *other)
{
uint8_t *src, *dst;
size_t src_count = __sm_get_chunk_map_count(other), dst_count = __sm_get_chunk_map_count(map), max_chunk_count = src_count + dst_count;
size_t src_count = __sm_get_chunk_map_count(other);
size_t dst_count = __sm_get_chunk_map_count(map);
size_t max_chunk_count = src_count + dst_count;
/* Estimate worst-case overhead required for merge. */
if (map->m_data_used + src_count * (sizeof(sm_idx_t) + sizeof(sm_bitvec_t) * 2) > map->m_capacity) {
errno = ENOSPC;
return -1;
}
// TODO: ensure there is space, or ENOSPC
dst = __sm_get_chunk_map_data(map, 0);
src = __sm_get_chunk_map_data(other, 0);
for (size_t i = 0; i < max_chunk_count && src_count; i++) {
@ -1321,6 +1330,7 @@ sparsemap_merge(sparsemap_t *map, sparsemap_t *other)
src_count--;
}
}
return 0;
}
void