Example #1
0
/**
 * btree_delete
 * @access public
 * @param btree struct
 * @return int 0 on success or error value
 *
 * Removes a node at key from the btree
 * Locks the entire tree until complete
 *
 * TODO: there is currently a hard to trigger bug in the delete algorithm
 * if you add at least 100 items and delete them in the order they were added
 * (FIFO) you'll lose a set of nodes from 48 to 52 and some more in the 70's and 90''s
 */
BTREE_API int btree_delete(btree_tree *t, uint64_t key)
{
	int error = 0;
	btree_node *n = t->root;
	uint32_t data_idx = 99999999; /* filled with the index to free */

	error = btree_admin_lock(t);
	if (error != 0) {
		return error;
	}

	if (btree_delete_internal(t, n, key, key, &data_idx)) {
		/* Do administrative jobs */
		t->header->item_count--;
		dr_set_remove(&(t->freelist), data_idx);
		error = btree_admin_unlock(t);
		if (error != 0) {
			return error;
		}
		return 0;
	}
	error = btree_admin_unlock(t);
	if (error != 0) {
		return error;
	}
	return 404; /* humorous attempt at node not found */
}
Example #2
0
inline void dr_set_init(dr_set *set)
{
	unsigned int i;

	// mass unset everything but the last byte
	memset(set->setinfo, 0xff, set->size / 8);

	// unset bits in the last byte
	for (i = 0; i < set->size % 8; i++) {
		dr_set_remove(set, i + (set->size / 8) * 8);
	}
}
Example #3
0
int main(void)
{
	dr_set *set;

	set = dr_set_create(33);

	printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO");
	dr_set_add(set, 4);
	printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO");
	dr_set_remove(set, 4);
	printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO");

	dr_set_dump(set);
	dr_set_free(set);

	return 0;
}