diff options
author | SChernykh <sergey.v.chernykh@gmail.com> | 2020-10-20 14:16:09 +0200 |
---|---|---|
committer | SChernykh <sergey.v.chernykh@gmail.com> | 2020-10-20 14:16:09 +0200 |
commit | a25bc71f3faf3f7ca4de9eda6342503768bf28ad (patch) | |
tree | 9493846d8297b373769161737fac91f17bb5dcbc /src | |
parent | Merge pull request #6891 (diff) | |
download | monero-a25bc71f3faf3f7ca4de9eda6342503768bf28ad.tar.xz |
Make Blockchain::get_fee_quantization_mask() compile time
This also removes potential thread safety bug in that function.
Diffstat (limited to 'src')
-rw-r--r-- | src/common/powerof.h | 26 | ||||
-rw-r--r-- | src/cryptonote_core/blockchain.cpp | 13 | ||||
-rw-r--r-- | src/cryptonote_core/blockchain.h | 6 |
3 files changed, 31 insertions, 14 deletions
diff --git a/src/common/powerof.h b/src/common/powerof.h new file mode 100644 index 000000000..0f6c6254a --- /dev/null +++ b/src/common/powerof.h @@ -0,0 +1,26 @@ +#pragma once + +#include <stdint.h> + +namespace tools +{ + template<uint64_t a, uint64_t b> + struct PowerOf + { + enum Data : uint64_t + { + // a^b = a * a^(b-1) + Value = a * PowerOf<a, b - 1>::Value, + }; + }; + + template<uint64_t a> + struct PowerOf<a, 0> + { + enum Data : uint64_t + { + // a^0 = 1 + Value = 1, + }; + }; +} diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index f91b3d6c1..9ad9afc94 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -3629,19 +3629,6 @@ void Blockchain::check_ring_signature(const crypto::hash &tx_prefix_hash, const } //------------------------------------------------------------------ -uint64_t Blockchain::get_fee_quantization_mask() -{ - static uint64_t mask = 0; - if (mask == 0) - { - mask = 1; - for (size_t n = PER_KB_FEE_QUANTIZATION_DECIMALS; n < CRYPTONOTE_DISPLAY_DECIMAL_POINT; ++n) - mask *= 10; - } - return mask; -} - -//------------------------------------------------------------------ uint64_t Blockchain::get_dynamic_base_fee(uint64_t block_reward, size_t median_block_weight, uint8_t version) { const uint64_t min_block_weight = get_min_block_weight(version); diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index a9b7ca1da..a8e251c71 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -51,6 +51,7 @@ #include "string_tools.h" #include "rolling_median.h" #include "cryptonote_basic/cryptonote_basic.h" +#include "common/powerof.h" #include "common/util.h" #include "cryptonote_protocol/cryptonote_protocol_defs.h" #include "rpc/core_rpc_server_commands_defs.h" @@ -591,7 +592,10 @@ namespace cryptonote * * @return the fee quantized mask */ - static uint64_t get_fee_quantization_mask(); + static uint64_t get_fee_quantization_mask() + { + return tools::PowerOf<10, CRYPTONOTE_DISPLAY_DECIMAL_POINT - PER_KB_FEE_QUANTIZATION_DECIMALS>::Value; + } /** * @brief get dynamic per kB or byte fee for a given block weight |