| 78 | } |
| 79 | |
| 80 | void concurrencpp::details::result_state_base::share(const std::shared_ptr<shared_result_state_base>& shared_result_state) noexcept { |
| 81 | const auto state = m_pc_state.load(std::memory_order_acquire); |
| 82 | if (state == pc_state::producer_done) { |
| 83 | return shared_result_state->on_result_finished(); |
| 84 | } |
| 85 | |
| 86 | m_consumer.set_shared_context(shared_result_state); |
| 87 | |
| 88 | auto expected_state = pc_state::idle; |
| 89 | const auto idle = m_pc_state.compare_exchange_strong(expected_state, |
| 90 | pc_state::consumer_set, |
| 91 | std::memory_order_acq_rel, |
| 92 | std::memory_order_acquire); |
| 93 | |
| 94 | if (idle) { |
| 95 | return; |
| 96 | } |
| 97 | |
| 98 | assert_done(); |
| 99 | shared_result_state->on_result_finished(); |
| 100 | } |
| 101 | |
| 102 | void result_state_base::try_rewind_consumer() noexcept { |
| 103 | const auto pc_state = m_pc_state.load(std::memory_order_acquire); |
nothing calls this directly
no test coverage detected