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; }
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; }
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; }