Example #1
0
bool initialize_packet_slinger()
{
	if (slinger_initialized) return true;

	initialize_slinger_frame_lookup();

	e_memset(link_state, 0, 2 * sizeof(slinger_link_state_t));

	link_state[slinger_link_highrate].link_enum = slinger_link_highrate;
	link_state[slinger_link_biphase].link_enum = slinger_link_biphase;

	link_state[slinger_link_highrate].downlink_pq = create_pq(SLINGER_MAX_PRIORITY);
	link_state[slinger_link_biphase].downlink_pq = create_pq(SLINGER_MAX_PRIORITY);
	link_state[slinger_link_highrate].resend_fifo = fifo_new();
	link_state[slinger_link_biphase].resend_fifo = fifo_new();

	link_state[slinger_link_highrate].control_fifo_queue = fifo_new();
	link_state[slinger_link_highrate].downlink_fifo = fifo_new();
	link_state[slinger_link_biphase].control_fifo_queue = fifo_new();
	link_state[slinger_link_biphase].downlink_fifo = fifo_new();

	link_state[slinger_link_highrate].fifo_pause_us = 50000;
	link_state[slinger_link_biphase].fifo_pause_us = 9984;

	link_state[slinger_link_highrate].device = bstrdup(err, "/dev/ttyHighRate");
	link_state[slinger_link_biphase].device = bstrdup(err, "/dev/bi0_pci");

	link_state[slinger_link_biphase].bps = 1000000;

	/// Initialize the downlink rate for TDRSS Omni-directional
	set_slinger_dl_rate(CommandData.packet_slinger.downlink_rate_bps);

	initialize_slinger_tables();
	if (!slinger_xml_load_preferences("/data/etc/packetslinger.xml")) return false;

	slinger_initialized = true;
	return true;
}
/**
 * Compute the union of 'number' bitmaps using a heap. This can
 * sometimes be faster than roaring_bitmap_or_many which uses
 * a naive algorithm. Caller is responsible for freeing the
 * result.
 */
roaring_bitmap_t *roaring_bitmap_or_many_heap(uint32_t number,
		const roaring_bitmap_t **x) {
	if (number == 0) {
		return roaring_bitmap_create();
	}
	if (number == 1) {
		return roaring_bitmap_copy(x[0]);
	}
	roaring_pq_t *pq = create_pq(x, number);
	while (pq->size > 1) {
		roaring_pq_element_t x1 = pq_poll(pq);
		roaring_pq_element_t x2 = pq_poll(pq);

		if (x1.is_temporary && x2.is_temporary) {
                        roaring_bitmap_t *newb =lazy_or_from_lazy_inputs(x1.bitmap,
					x2.bitmap);
			uint64_t bsize = roaring_bitmap_portable_size_in_bytes(newb);
			roaring_pq_element_t newelement = { .size = bsize, .is_temporary =
					true, .bitmap = newb };
			pq_add(pq, &newelement);
		} else if (x2.is_temporary) {
                        roaring_bitmap_lazy_or_inplace(x2.bitmap, x1.bitmap);
			x2.size = roaring_bitmap_portable_size_in_bytes(x2.bitmap);
			pq_add(pq, &x2);
		} else if (x1.is_temporary) {
			roaring_bitmap_lazy_or_inplace(x1.bitmap, x2.bitmap);
			x1.size = roaring_bitmap_portable_size_in_bytes(x1.bitmap);

			pq_add(pq, &x1);
		} else {
		  roaring_bitmap_t *newb = roaring_bitmap_lazy_or(x1.bitmap,
					x2.bitmap);
			uint64_t bsize = roaring_bitmap_portable_size_in_bytes(newb);
			roaring_pq_element_t newelement = { .size = bsize, .is_temporary =
					true, .bitmap = newb };

			pq_add(pq, &newelement);
		}

	}
	roaring_pq_element_t X = pq_poll(pq);
	roaring_bitmap_t *answer = X.bitmap;
	roaring_bitmap_repair_after_lazy(answer);
	pq_free(pq);
	return answer;
}
/**
 * Compute the union of 'number' bitmaps using a heap. This can
 * sometimes be faster than roaring_bitmap_or_many which uses
 * a naive algorithm. Caller is responsible for freeing the
 * result.
 */
roaring_bitmap_t *roaring_bitmap_or_many_heap(uint32_t number,
                                              const roaring_bitmap_t **x) {
    if (number == 0) {
        return roaring_bitmap_create();
    }
    if (number == 1) {
        return roaring_bitmap_copy(x[0]);
    }
    roaring_pq_t *pq = create_pq(x, number);
    while (pq->size > 1) {
        roaring_pq_element_t x1 = pq_poll(pq);
        roaring_pq_element_t x2 = pq_poll(pq);

        if (x1.is_temporary && x2.is_temporary) {
            roaring_bitmap_t *newb =
                lazy_or_from_lazy_inputs(x1.bitmap, x2.bitmap);
            // should normally return a fresh new bitmap *except* that
            // it can return x1.bitmap or x2.bitmap in degenerate cases
            bool temporary = !((newb == x1.bitmap) && (newb == x2.bitmap));
            uint64_t bsize = roaring_bitmap_portable_size_in_bytes(newb);
            roaring_pq_element_t newelement = {
                .size = bsize, .is_temporary = temporary, .bitmap = newb};
            pq_add(pq, &newelement);
        } else if (x2.is_temporary) {