Example #1
0
int ring_bond::mem_buf_tx_release(mem_buf_desc_t* p_mem_buf_desc_list, bool b_accounting, bool trylock/*=false*/)
{
	mem_buf_desc_t* buffer_per_ring[m_n_num_resources];
	memset(buffer_per_ring, 0, m_n_num_resources * sizeof(mem_buf_desc_t*));
	devide_buffers_helper(p_mem_buf_desc_list, buffer_per_ring);
	int ret = 0;
	for (uint32_t i = 0; i < m_n_num_resources; i++) {
		if (buffer_per_ring[i])
			ret += m_bond_rings[i]->mem_buf_tx_release(buffer_per_ring[i], b_accounting, trylock);
	}
	return ret;
}
Example #2
0
bool ring_bond::reclaim_recv_buffers(descq_t *rx_reuse)
{
	descq_t buffer_per_ring[m_n_num_resources + 1];
	devide_buffers_helper(rx_reuse, buffer_per_ring);
	for (uint32_t i = 0; i < m_n_num_resources; i++) {
		if (buffer_per_ring[i].size() > 0) {
			if (!m_bond_rings[i]->reclaim_recv_buffers(&buffer_per_ring[i])) {
				g_buffer_pool_rx->put_buffers_after_deref_thread_safe(&buffer_per_ring[i]);
			}
		}
	}

	if (buffer_per_ring[m_n_num_resources].size() > 0)
		g_buffer_pool_rx->put_buffers_after_deref_thread_safe(&buffer_per_ring[m_n_num_resources]);

	return true;
}
Example #3
0
bool ring_bond::reclaim_recv_buffers(descq_t *rx_reuse)
{
	/* use this local array to avoid locking mechanizm
	 * for threads synchronization. So every thread should use
	 * own array. Set hardcoded number to meet C++11
	 * VLA is not an official part of C++11.
	 */
	descq_t buffer_per_ring[MAX_NUM_RING_RESOURCES];

	devide_buffers_helper(rx_reuse, buffer_per_ring);
	for (uint32_t i = 0; i < m_n_num_resources; i++) {
		if (buffer_per_ring[i].size() > 0) {
			if (!m_bond_rings[i]->reclaim_recv_buffers(&buffer_per_ring[i])) {
				g_buffer_pool_rx->put_buffers_after_deref_thread_safe(&buffer_per_ring[i]);
			}
		}
	}

	if (buffer_per_ring[m_n_num_resources].size() > 0)
		g_buffer_pool_rx->put_buffers_after_deref_thread_safe(&buffer_per_ring[m_n_num_resources]);

	return true;
}