mirror of https://github.com/pvnis/srsRAN_4G.git
pcap: make PCAP write thread-safe
* offload PCAP writing to background thread * use blocking_queue between writer and clients to make it thread-safe * add basic test case this fixes point 1-3 of #2161master
parent
732a108982
commit
4fa89b7039
@ -0,0 +1,62 @@
|
||||
/**
|
||||
*
|
||||
* \section COPYRIGHT
|
||||
*
|
||||
* Copyright 2013-2020 Software Radio Systems Limited
|
||||
*
|
||||
* By using this file, you agree to the terms and conditions set
|
||||
* forth in the LICENSE file which can be found at the top level of
|
||||
* the distribution.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "srslte/common/common.h"
|
||||
#include "srslte/common/mac_pcap.h"
|
||||
#include "srslte/common/test_common.h"
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
void write_pcap_thread_function(srslte::mac_pcap* pcap_handle, const std::array<uint8_t, 150>& pdu, uint32_t num_pdus)
|
||||
{
|
||||
for (uint32_t i = 0; i < num_pdus; i++) {
|
||||
pcap_handle->write_ul_crnti(const_cast<uint8_t*>(pdu.data()), pdu.size(), 0x1001, true, 1, 0);
|
||||
}
|
||||
|
||||
std::cout << "Finished thread " << std::this_thread::get_id() << "\n";
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::array<uint8_t, 150> tv = {
|
||||
0x21, 0x08, 0x22, 0x80, 0x82, 0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
|
||||
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
uint32_t num_threads = 10;
|
||||
uint32_t num_pdus_per_thread = 100;
|
||||
|
||||
std::unique_ptr<srslte::mac_pcap> pcap_handle = std::unique_ptr<srslte::mac_pcap>(new srslte::mac_pcap());
|
||||
TESTASSERT(pcap_handle->open("mac_pcap_test.pcap") == SRSLTE_SUCCESS);
|
||||
TESTASSERT(pcap_handle->open("mac_pcap_test.pcap") != SRSLTE_SUCCESS); // open again will fail
|
||||
|
||||
std::vector<std::thread> writer_threads;
|
||||
|
||||
for (uint32_t i = 0; i < num_threads; i++) {
|
||||
writer_threads.push_back(std::thread(write_pcap_thread_function, pcap_handle.get(), tv, num_pdus_per_thread));
|
||||
}
|
||||
|
||||
// wait for threads to finish
|
||||
for (std::thread& thread : writer_threads) {
|
||||
thread.join();
|
||||
}
|
||||
|
||||
TESTASSERT(pcap_handle->close() == SRSLTE_SUCCESS);
|
||||
TESTASSERT(pcap_handle->close() != 0); // closing twice will fail
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue