diff options
author | Thomas Habets <thomas@habets.se> | 2020-08-29 23:18:16 +0100 |
---|---|---|
committer | Martin Braun <martin@gnuradio.org> | 2020-09-07 05:14:14 -0700 |
commit | d2c9de98b52e7e9a4918190b1e7079496d2a13b6 (patch) | |
tree | 74b9de2495d7e4ab79dd13bbf6338ca2fb1e2501 | |
parent | 0d1d600ab622075a4e56e66642e67fc5c983450e (diff) |
fec: Remove manual memory management
This removes almost all manual memory management in gr-fec/.
`scl_list` is a bit of magic, so requires more thinking.
-rw-r--r-- | gr-fec/include/gnuradio/fec/cc_common.h | 6 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/polar_decoder_sc.h | 4 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h | 6 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/polar_encoder.h | 9 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/polar_encoder_systematic.h | 2 | ||||
-rw-r--r-- | gr-fec/lib/cc_decoder_impl.cc | 42 | ||||
-rw-r--r-- | gr-fec/lib/cc_decoder_impl.h | 6 | ||||
-rw-r--r-- | gr-fec/lib/polar_decoder_sc.cc | 22 | ||||
-rw-r--r-- | gr-fec/lib/polar_decoder_sc_systematic.cc | 28 | ||||
-rw-r--r-- | gr-fec/lib/polar_encoder.cc | 36 | ||||
-rw-r--r-- | gr-fec/lib/polar_encoder_systematic.cc | 14 | ||||
-rw-r--r-- | gr-fec/lib/scl_list.h | 8 | ||||
-rw-r--r-- | gr-fec/python/fec/bindings/polar_decoder_sc_python.cc | 2 | ||||
-rw-r--r-- | gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc | 2 | ||||
-rw-r--r-- | gr-fec/python/fec/bindings/polar_encoder_python.cc | 2 | ||||
-rw-r--r-- | gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc | 2 |
16 files changed, 81 insertions, 110 deletions
diff --git a/gr-fec/include/gnuradio/fec/cc_common.h b/gr-fec/include/gnuradio/fec/cc_common.h index 0ece003713..190897a8cd 100644 --- a/gr-fec/include/gnuradio/fec/cc_common.h +++ b/gr-fec/include/gnuradio/fec/cc_common.h @@ -11,6 +11,8 @@ #ifndef INCLUDED_FEC_CC_COMMON_H #define INCLUDED_FEC_CC_COMMON_H +#include <volk/volk_alloc.hh> + typedef enum _cc_mode_t { CC_STREAMING = 0, CC_TERMINATED, @@ -31,10 +33,10 @@ typedef union { } metric_t; struct v { - unsigned char* metrics; + volk::vector<unsigned char> metrics; metric_t old_metrics, new_metrics, metrics1, metrics2; /* Pointers to path metrics, swapped on every bit */ - unsigned char* decisions; + volk::vector<unsigned char> decisions; }; #endif /*INCLUDED_FEC_CC_COMMON_H*/ diff --git a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h index 23886dc2f7..8a8cc49759 100644 --- a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h +++ b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h @@ -59,8 +59,8 @@ private: std::vector<int> frozen_bit_positions, std::vector<uint8_t> frozen_bit_values); - float* d_llr_vec; - unsigned char* d_u_hat_vec; + volk::vector<float> d_llr_vec; + volk::vector<unsigned char> d_u_hat_vec; unsigned char retrieve_bit_from_llr(float llr, const int pos); void sc_decode(float* llrs, unsigned char* u); diff --git a/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h b/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h index b001849cca..84011a0f69 100644 --- a/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h +++ b/gr-fec/include/gnuradio/fec/polar_decoder_sc_systematic.h @@ -57,9 +57,9 @@ private: polar_decoder_sc_systematic(int block_size, int num_info_bits, std::vector<int> frozen_bit_positions); - float* d_llr_vec; - unsigned char* d_u_hat_vec; - unsigned char* d_frame_vec; + volk::vector<float> d_llr_vec; + volk::vector<unsigned char> d_u_hat_vec; + volk::vector<unsigned char> d_frame_vec; unsigned char retrieve_bit_from_llr(float llr, const int pos); void sc_decode(float* llrs, unsigned char* u); void extract_info_bits_reversed(unsigned char* outbuf, const unsigned char* inbuf); diff --git a/gr-fec/include/gnuradio/fec/polar_encoder.h b/gr-fec/include/gnuradio/fec/polar_encoder.h index c76a495050..6bd6afbe77 100644 --- a/gr-fec/include/gnuradio/fec/polar_encoder.h +++ b/gr-fec/include/gnuradio/fec/polar_encoder.h @@ -74,12 +74,13 @@ private: bool is_packed); bool d_is_packed; - // c'tor method for packed algorithm setup. - void setup_frozen_bit_inserter(); + // Helper function to allow `d_frozen_bit_prototype` to be const. + volk::vector<unsigned char> make_prototype() const; // methods insert input bits and frozen bits into packed array for encoding - unsigned char* d_frozen_bit_prototype; // packed frozen bits are written onto it and - // later copies are used. + const volk::vector<unsigned char> + d_frozen_bit_prototype; // packed frozen bits are written onto it and + // later copies are used. void insert_packed_frozen_bits_and_reverse(unsigned char* target, const unsigned char* input) const; void insert_unpacked_bit_into_packed_array_at_position(unsigned char* target, diff --git a/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h b/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h index b4932b626a..0fe9e8ea09 100644 --- a/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h +++ b/gr-fec/include/gnuradio/fec/polar_encoder_systematic.h @@ -70,7 +70,7 @@ private: void bit_reverse_and_reset_frozen_bits(unsigned char* outbuf, const unsigned char* inbuf); - unsigned char* d_volk_syst_intermediate; + volk::vector<unsigned char> d_volk_syst_intermediate; }; } // namespace code diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc index 2ff08e018d..21062e4f41 100644 --- a/gr-fec/lib/cc_decoder_impl.cc +++ b/gr-fec/lib/cc_decoder_impl.cc @@ -98,26 +98,13 @@ cc_decoder_impl::cc_decoder_impl(int frame_size, throw std::runtime_error("cc_decoder: mode not recognized"); } - d_vp.metrics = (unsigned char*)volk_malloc(2 * sizeof(unsigned char) * d_numstates, - volk_get_alignment()); - if (d_vp.metrics == NULL) { - throw std::runtime_error("bad alloc for d_vp.metrics!"); - } - - d_vp.metrics1.t = d_vp.metrics; - d_vp.metrics2.t = d_vp.metrics + d_numstates; + d_vp.metrics.resize(2 * d_numstates); + d_vp.metrics1.t = d_vp.metrics.data(); + d_vp.metrics2.t = d_vp.metrics.data() + d_numstates; - d_vp.decisions = (unsigned char*)volk_malloc( - sizeof(unsigned char) * d_veclen * d_decision_t_size, volk_get_alignment()); - if (d_vp.decisions == NULL) { - throw std::runtime_error("bad alloc for d_vp.decisions!"); - } + d_vp.decisions.resize(d_veclen * d_decision_t_size); - Branchtab = (unsigned char*)volk_malloc( - sizeof(unsigned char) * d_numstates / 2 * rate, volk_get_alignment()); - if (Branchtab == NULL) { - throw std::runtime_error("bad alloc for d_vp.decisions!"); - } + d_branchtab.resize(d_numstates / 2 * rate); create_viterbi(); @@ -147,12 +134,7 @@ cc_decoder_impl::cc_decoder_impl(int frame_size, } } -cc_decoder_impl::~cc_decoder_impl() -{ - volk_free(d_vp.decisions); - volk_free(Branchtab); - volk_free(d_vp.metrics); -} +cc_decoder_impl::~cc_decoder_impl() {} int cc_decoder_impl::get_output_size() { @@ -191,7 +173,7 @@ void cc_decoder_impl::create_viterbi() partab_init(); for (state = 0; state < d_numstates / 2; state++) { for (i = 0; i < d_rate; i++) { - Branchtab[i * d_numstates / 2 + state] = + d_branchtab[i * d_numstates / 2 + state] = (d_polys[i] < 0) ^ parity((2 * state) & abs(d_polys[i])) ? 255 : 0; } } @@ -297,9 +279,7 @@ int cc_decoder_impl::find_endstate() int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits) { - unsigned char* d; - - d = d_vp.decisions; + unsigned char* d = d_vp.decisions.data(); memset(d, 0, d_decision_t_size * nbits); @@ -309,7 +289,7 @@ int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits) d, nbits - (d_k - 1), d_k - 1, - Branchtab); + d_branchtab.data()); return 0; } @@ -319,10 +299,8 @@ int cc_decoder_impl::chainback_viterbi(unsigned char* data, unsigned int endstate, unsigned int tailsize) { - unsigned char* d; - /* ADDSHIFT and SUBSHIFT make sure that the thing returned is a byte. */ - d = d_vp.decisions; + unsigned char* d = d_vp.decisions.data(); /* Make room beyond the end of the encoder register so we can * accumulate a full byte of decoded data */ diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h index e39cd9846a..d7d236da21 100644 --- a/gr-fec/lib/cc_decoder_impl.h +++ b/gr-fec/lib/cc_decoder_impl.h @@ -43,7 +43,7 @@ private: unsigned int tailsize); int find_endstate(); - unsigned char* Branchtab; + volk::vector<unsigned char> d_branchtab; unsigned char Partab[256]; @@ -85,6 +85,10 @@ public: bool padded = false); ~cc_decoder_impl(); + // Disable copy because of the raw pointers. + cc_decoder_impl(const cc_decoder_impl&) = delete; + cc_decoder_impl& operator=(const cc_decoder_impl&) = delete; + void generic_work(void* inbuffer, void* outbuffer); bool set_frame_size(unsigned int frame_size); double rate(); diff --git a/gr-fec/lib/polar_decoder_sc.cc b/gr-fec/lib/polar_decoder_sc.cc index 9d694bf3bb..eee78fabf8 100644 --- a/gr-fec/lib/polar_decoder_sc.cc +++ b/gr-fec/lib/polar_decoder_sc.cc @@ -37,30 +37,22 @@ polar_decoder_sc::polar_decoder_sc(int block_size, std::vector<int> frozen_bit_positions, std::vector<uint8_t> frozen_bit_values) : polar_decoder_common( - block_size, num_info_bits, frozen_bit_positions, frozen_bit_values) + block_size, num_info_bits, frozen_bit_positions, frozen_bit_values), + d_llr_vec(block_size * (block_power() + 1)), + d_u_hat_vec(block_size * (block_power() + 1)) { - d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1), - volk_get_alignment()); - memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1)); - d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1), - volk_get_alignment()); - memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1)); } -polar_decoder_sc::~polar_decoder_sc() -{ - volk_free(d_llr_vec); - volk_free(d_u_hat_vec); -} +polar_decoder_sc::~polar_decoder_sc() {} void polar_decoder_sc::generic_work(void* in_buffer, void* out_buffer) { const float* in = (const float*)in_buffer; unsigned char* out = (unsigned char*)out_buffer; - initialize_decoder(d_u_hat_vec, d_llr_vec, in); - sc_decode(d_llr_vec, d_u_hat_vec); - extract_info_bits(out, d_u_hat_vec); + initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in); + sc_decode(d_llr_vec.data(), d_u_hat_vec.data()); + extract_info_bits(out, d_u_hat_vec.data()); } void polar_decoder_sc::sc_decode(float* llrs, unsigned char* u) diff --git a/gr-fec/lib/polar_decoder_sc_systematic.cc b/gr-fec/lib/polar_decoder_sc_systematic.cc index 20fbad2d38..cd8f3db586 100644 --- a/gr-fec/lib/polar_decoder_sc_systematic.cc +++ b/gr-fec/lib/polar_decoder_sc_systematic.cc @@ -30,34 +30,24 @@ generic_decoder::sptr polar_decoder_sc_systematic::make( polar_decoder_sc_systematic::polar_decoder_sc_systematic( int block_size, int num_info_bits, std::vector<int> frozen_bit_positions) : polar_decoder_common( - block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()) + block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()), + d_llr_vec(block_size * (block_power() + 1)), + d_u_hat_vec(block_size * (block_power() + 1)), + d_frame_vec(block_size) { - d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1), - volk_get_alignment()); - memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1)); - d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1), - volk_get_alignment()); - memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1)); - d_frame_vec = (unsigned char*)volk_malloc(block_size, volk_get_alignment()); - memset(d_frame_vec, 0, sizeof(unsigned char) * block_size); } -polar_decoder_sc_systematic::~polar_decoder_sc_systematic() -{ - volk_free(d_llr_vec); - volk_free(d_u_hat_vec); - volk_free(d_frame_vec); -} +polar_decoder_sc_systematic::~polar_decoder_sc_systematic() {} void polar_decoder_sc_systematic::generic_work(void* in_buffer, void* out_buffer) { const float* in = (const float*)in_buffer; unsigned char* out = (unsigned char*)out_buffer; - initialize_decoder(d_u_hat_vec, d_llr_vec, in); - sc_decode(d_llr_vec, d_u_hat_vec); - volk_encode_block(d_frame_vec, d_u_hat_vec); - extract_info_bits_reversed(out, d_frame_vec); + initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in); + sc_decode(d_llr_vec.data(), d_u_hat_vec.data()); + volk_encode_block(d_frame_vec.data(), d_u_hat_vec.data()); + extract_info_bits_reversed(out, d_frame_vec.data()); } void polar_decoder_sc_systematic::sc_decode(float* llrs, unsigned char* u) diff --git a/gr-fec/lib/polar_encoder.cc b/gr-fec/lib/polar_encoder.cc index 568a0b8e5e..84633ec893 100644 --- a/gr-fec/lib/polar_encoder.cc +++ b/gr-fec/lib/polar_encoder.cc @@ -25,6 +25,19 @@ namespace gr { namespace fec { namespace code { +volk::vector<unsigned char> polar_encoder::make_prototype() const +{ + volk::vector<unsigned char> proto(block_size() >> 3); + + for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) { + int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power()); + unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i); + insert_unpacked_bit_into_packed_array_at_position( + proto.data(), frozen_bit, rev_pos); + } + return proto; +} + generic_encoder::sptr polar_encoder::make(int block_size, int num_info_bits, std::vector<int> frozen_bit_positions, @@ -41,26 +54,12 @@ polar_encoder::polar_encoder(int block_size, std::vector<uint8_t>& frozen_bit_values, bool is_packed) : polar_common(block_size, num_info_bits, frozen_bit_positions, frozen_bit_values), - d_is_packed(is_packed) + d_is_packed(is_packed), + d_frozen_bit_prototype(make_prototype()) { - setup_frozen_bit_inserter(); -} - -void polar_encoder::setup_frozen_bit_inserter() -{ - d_frozen_bit_prototype = - (unsigned char*)volk_malloc(block_size() >> 3, volk_get_alignment()); - memset(d_frozen_bit_prototype, 0, block_size() >> 3); - - for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) { - int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power()); - unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i); - insert_unpacked_bit_into_packed_array_at_position( - d_frozen_bit_prototype, frozen_bit, rev_pos); - } } -polar_encoder::~polar_encoder() { volk_free(d_frozen_bit_prototype); } +polar_encoder::~polar_encoder() {} void polar_encoder::generic_work(void* in_buffer, void* out_buffer) { @@ -129,7 +128,8 @@ void polar_encoder::encode_vector_packed_interbyte(unsigned char* target) const void polar_encoder::insert_packed_frozen_bits_and_reverse( unsigned char* target, const unsigned char* input) const { - memcpy(target, d_frozen_bit_prototype, block_size() >> 3); + std::copy( + std::begin(d_frozen_bit_prototype), std::end(d_frozen_bit_prototype), target); const int* info_bit_reversed_positions_ptr = &d_info_bit_positions_reversed[0]; int bit_num = 0; unsigned char byte = *input; diff --git a/gr-fec/lib/polar_encoder_systematic.cc b/gr-fec/lib/polar_encoder_systematic.cc index b77f5e0730..ddf898d8b0 100644 --- a/gr-fec/lib/polar_encoder_systematic.cc +++ b/gr-fec/lib/polar_encoder_systematic.cc @@ -31,16 +31,12 @@ polar_encoder_systematic::polar_encoder_systematic(int block_size, int num_info_bits, std::vector<int> frozen_bit_positions) : polar_common( - block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()) + block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()), + d_volk_syst_intermediate(block_size) { - d_volk_syst_intermediate = (unsigned char*)volk_malloc( - sizeof(unsigned char) * block_size, volk_get_alignment()); } -polar_encoder_systematic::~polar_encoder_systematic() -{ - volk_free(d_volk_syst_intermediate); -} +polar_encoder_systematic::~polar_encoder_systematic() {} void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer) { @@ -48,8 +44,8 @@ void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer) unsigned char* out = (unsigned char*)out_buffer; volk_encode(out, in); - bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate, out); - volk_encode_block(out, d_volk_syst_intermediate); + bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate.data(), out); + volk_encode_block(out, d_volk_syst_intermediate.data()); } void polar_encoder_systematic::bit_reverse_and_reset_frozen_bits( diff --git a/gr-fec/lib/scl_list.h b/gr-fec/lib/scl_list.h index db60b570bc..75eb2fa57f 100644 --- a/gr-fec/lib/scl_list.h +++ b/gr-fec/lib/scl_list.h @@ -20,6 +20,9 @@ namespace polar { struct path { path(); + // Disable copy because of raw pointers. + path(const path&) = delete; + path& operator=(const path&) = delete; ~path(); float path_metric; bool owns_vectors; @@ -56,6 +59,11 @@ public: scl_list(const unsigned int list_size, const unsigned int block_size, const unsigned int block_power); + + // Disable copy because of raw pointers. + scl_list(const scl_list&) = delete; + scl_list& operator=(const scl_list&) = delete; + virtual ~scl_list(); const unsigned int size() const { return d_list_size; }; const unsigned int active_size() const { return d_active_path_counter; }; diff --git a/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc b/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc index 88a5c4a35f..c630623192 100644 --- a/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc +++ b/gr-fec/python/fec/bindings/polar_decoder_sc_python.cc @@ -14,7 +14,7 @@ /* BINDTOOL_GEN_AUTOMATIC(0) */ /* BINDTOOL_USE_PYGCCXML(0) */ /* BINDTOOL_HEADER_FILE(polar_decoder_sc.h) */ -/* BINDTOOL_HEADER_FILE_HASH(4f87bd7af297a4f14cb8cc3e99af54df) */ +/* BINDTOOL_HEADER_FILE_HASH(e88266330956e15ca422091c6a3c2474) */ /***********************************************************************************/ #include <pybind11/complex.h> diff --git a/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc b/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc index 026b456b0e..68047d167a 100644 --- a/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc +++ b/gr-fec/python/fec/bindings/polar_decoder_sc_systematic_python.cc @@ -14,7 +14,7 @@ /* BINDTOOL_GEN_AUTOMATIC(0) */ /* BINDTOOL_USE_PYGCCXML(0) */ /* BINDTOOL_HEADER_FILE(polar_decoder_sc_systematic.h) */ -/* BINDTOOL_HEADER_FILE_HASH(309212b7e2e5619a81028e00aec2914b) */ +/* BINDTOOL_HEADER_FILE_HASH(6c8471f4ff472e9759f2d45d5a357780) */ /***********************************************************************************/ #include <pybind11/complex.h> diff --git a/gr-fec/python/fec/bindings/polar_encoder_python.cc b/gr-fec/python/fec/bindings/polar_encoder_python.cc index 74450346ce..38890f74bf 100644 --- a/gr-fec/python/fec/bindings/polar_encoder_python.cc +++ b/gr-fec/python/fec/bindings/polar_encoder_python.cc @@ -14,7 +14,7 @@ /* BINDTOOL_GEN_AUTOMATIC(0) */ /* BINDTOOL_USE_PYGCCXML(0) */ /* BINDTOOL_HEADER_FILE(polar_encoder.h) */ -/* BINDTOOL_HEADER_FILE_HASH(58ba51702adfdf1118d059d3f9880beb) */ +/* BINDTOOL_HEADER_FILE_HASH(edc7bd542cbccfc54f3a5195196f1298) */ /***********************************************************************************/ #include <pybind11/complex.h> diff --git a/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc b/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc index 1e884df436..4c7ac7f302 100644 --- a/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc +++ b/gr-fec/python/fec/bindings/polar_encoder_systematic_python.cc @@ -14,7 +14,7 @@ /* BINDTOOL_GEN_AUTOMATIC(0) */ /* BINDTOOL_USE_PYGCCXML(0) */ /* BINDTOOL_HEADER_FILE(polar_encoder_systematic.h) */ -/* BINDTOOL_HEADER_FILE_HASH(3030c93396c633b5f7fdba0b4d888e9e) */ +/* BINDTOOL_HEADER_FILE_HASH(7c456083d56b811565b459f2865eae7e) */ /***********************************************************************************/ #include <pybind11/complex.h> |