From 1a4f104b46cfd54ee4836372e860e902668993d6 Mon Sep 17 00:00:00 2001 From: wvpm <24685035+wvpm@users.noreply.github.com> Date: Wed, 20 May 2026 22:55:03 +0200 Subject: [PATCH] Use spin mutex for goods and countries --- .../country/CountryInstance.cpp | 19 ++++++++++--------- .../country/CountryInstance.hpp | 6 +++--- .../economy/trading/GoodMarket.cpp | 6 ++++-- .../economy/trading/GoodMarket.hpp | 6 +++--- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index 005a71f03..14bfe7a3d 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -2407,11 +2408,11 @@ void CountryInstance::country_tick_after_map(const Date today) { } CountryInstance::good_data_t::good_data_t() - : mutex { memory::make_unique() } + : mutex { memory::make_unique() } { } void CountryInstance::good_data_t::clear_daily_recorded_data() { - const std::lock_guard lock_guard { *mutex }; + const std::lock_guard lock_guard { *mutex }; stockpile_change_yesterday = quantity_traded_yesterday = money_traded_yesterday @@ -2431,24 +2432,24 @@ void CountryInstance::good_data_t::clear_daily_recorded_data() { } void CountryInstance::report_pop_income_tax(PopType const& pop_type, const fixed_point_t gross_income, const fixed_point_t paid_as_tax) { - const std::lock_guard lock_guard { taxable_income_mutex }; + const std::lock_guard lock_guard { taxable_income_mutex }; taxable_income_by_pop_type.at(pop_type) += gross_income; cash_stockpile += paid_as_tax; } void CountryInstance::report_pop_need_consumption(PopType const& pop_type, const good_index_t good_index, const fixed_point_t quantity) { good_data_t& good_data = goods_data.at_index(good_index); - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.need_consumption_per_pop_type[&pop_type] += quantity; } void CountryInstance::report_pop_need_demand(PopType const& pop_type, const good_index_t good_index, const fixed_point_t quantity) { good_data_t& good_data = goods_data.at_index(good_index); - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.pop_demand += quantity; } void CountryInstance::report_input_consumption(ProductionType const& production_type, const good_index_t good_index, const fixed_point_t quantity) { good_data_t& good_data = goods_data.at_index(good_index); - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.input_consumption_per_production_type[&production_type] += quantity; } void CountryInstance::report_input_demand(ProductionType const& production_type, const good_index_t good_index, const fixed_point_t quantity) { @@ -2458,7 +2459,7 @@ void CountryInstance::report_input_demand(ProductionType const& production_type, switch (game_rules_manager.get_artisanal_input_demand_category()) { case demand_category::FactoryNeeds: break; case demand_category::PopNeeds: { - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.pop_demand += quantity; return; } @@ -2466,12 +2467,12 @@ void CountryInstance::report_input_demand(ProductionType const& production_type, } } - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.factory_demand += quantity; } void CountryInstance::report_output(ProductionType const& production_type, const fixed_point_t quantity) { good_data_t& good_data = get_good_data(production_type.output_good); - const std::lock_guard lock_guard { *good_data.mutex }; + const std::lock_guard lock_guard { *good_data.mutex }; good_data.production_per_production_type[&production_type] += quantity; } diff --git a/src/openvic-simulation/country/CountryInstance.hpp b/src/openvic-simulation/country/CountryInstance.hpp index de43ef4c5..c9404f043 100644 --- a/src/openvic-simulation/country/CountryInstance.hpp +++ b/src/openvic-simulation/country/CountryInstance.hpp @@ -1,13 +1,13 @@ #pragma once #include -#include #include #include #include "openvic-simulation/core/memory/SmartPtr.hpp" #include "openvic-simulation/core/memory/Vector.hpp" +#include "openvic-simulation/core/thread/SpinMutex.hpp" #include "openvic-simulation/diplomacy/CountryRelation.hpp" #include "openvic-simulation/economy/BuildingLevel.hpp" #include "openvic-simulation/economy/BuildingRestrictionCategory.hpp" @@ -168,7 +168,7 @@ namespace OpenVic { ValueHistory PROPERTY(balance_history); OV_STATE_PROPERTY(fixed_point_t, gold_income); atomic_fixed_point_t PROPERTY(cash_stockpile); - std::mutex taxable_income_mutex; + spin_mutex taxable_income_mutex; OV_IFLATMAP_PROPERTY(PopType, fixed_point_t, taxable_income_by_pop_type); OV_STATE_PROPERTY(fixed_point_t, tax_efficiency); IndexedFlatMap> PROPERTY(effective_tax_rate_by_strata); @@ -304,7 +304,7 @@ namespace OpenVic { /* Trade */ struct good_data_t { - memory::unique_ptr mutex; + memory::unique_ptr mutex; fixed_point_t stockpile_amount; fixed_point_t stockpile_change_yesterday; // positive if we gained, negative if we lost fixed_point_t quantity_traded_yesterday; // positive if we bought, negative if we sold diff --git a/src/openvic-simulation/economy/trading/GoodMarket.cpp b/src/openvic-simulation/economy/trading/GoodMarket.cpp index 19599279f..1b2ac01c3 100644 --- a/src/openvic-simulation/economy/trading/GoodMarket.cpp +++ b/src/openvic-simulation/economy/trading/GoodMarket.cpp @@ -1,5 +1,7 @@ #include "GoodMarket.hpp" + #include +#include #include "openvic-simulation/economy/GoodDefinition.hpp" #include "openvic-simulation/economy/trading/BuyUpToOrder.hpp" @@ -56,12 +58,12 @@ void GoodMarket::update_next_price_limits() { } void GoodMarket::add_buy_up_to_order(GoodBuyUpToOrder&& buy_up_to_order) { - const std::lock_guard lock_guard { buy_lock }; + const std::lock_guard lock_guard { buy_lock }; buy_up_to_orders.push_back(std::move(buy_up_to_order)); } void GoodMarket::add_market_sell_order(GoodMarketSellOrder&& market_sell_order) { - const std::lock_guard lock_guard { sell_lock }; + const std::lock_guard lock_guard { sell_lock }; market_sell_orders.push_back(std::move(market_sell_order)); } diff --git a/src/openvic-simulation/economy/trading/GoodMarket.hpp b/src/openvic-simulation/economy/trading/GoodMarket.hpp index 04f90b2b7..41be0dcbe 100644 --- a/src/openvic-simulation/economy/trading/GoodMarket.hpp +++ b/src/openvic-simulation/economy/trading/GoodMarket.hpp @@ -1,9 +1,9 @@ #pragma once -#include #include #include "openvic-simulation/core/memory/Vector.hpp" +#include "openvic-simulation/core/thread/SpinMutex.hpp" #include "openvic-simulation/economy/trading/BuyUpToOrder.hpp" #include "openvic-simulation/economy/trading/MarketSellOrder.hpp" #include "openvic-simulation/types/fixed_point/FixedPoint.hpp" @@ -19,8 +19,8 @@ namespace OpenVic { struct GoodMarket { private: static constexpr int32_t exponential_price_change_shift = 7; - std::mutex buy_lock; - std::mutex sell_lock; + spin_mutex buy_lock; + spin_mutex sell_lock; GameRulesManager const& game_rules_manager; fixed_point_t absolute_maximum_price; fixed_point_t absolute_minimum_price;