Implement the two worker functions
This commit is contained in:
70
src/worker.cpp
Normal file
70
src/worker.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
/* worker.cpp: Implementation of workers in our simulation
|
||||
* Created: 2025-11-27
|
||||
* Author: Aryadev Chavali
|
||||
* License: See end of file
|
||||
* Commentary:
|
||||
*/
|
||||
|
||||
#include "worker.hpp"
|
||||
#include <tuple>
|
||||
|
||||
namespace cw::worker
|
||||
{
|
||||
using cw::node::Fraction;
|
||||
using cw::node::Node;
|
||||
|
||||
std::tuple<u64, u64> generate_children(NodeAllocator &allocator, u64 index)
|
||||
{
|
||||
Node node = allocator.get_val(index);
|
||||
if (node.left < 0)
|
||||
{
|
||||
allocator.get_ref(index).left = allocator.alloc(Fraction{
|
||||
node.value.numerator, node.value.numerator + node.value.denominator});
|
||||
}
|
||||
if (node.right < 0)
|
||||
{
|
||||
allocator.get_ref(index).right = allocator.alloc(
|
||||
Fraction{node.value.numerator + node.value.denominator,
|
||||
node.value.denominator});
|
||||
}
|
||||
return {node.left, node.right};
|
||||
}
|
||||
|
||||
void do_iteration(State &state)
|
||||
{
|
||||
state.mutex_queue.lock();
|
||||
if (state.queue.empty())
|
||||
{
|
||||
// Unlock since there isn't any work to be done.
|
||||
state.mutex_queue.unlock();
|
||||
return;
|
||||
}
|
||||
u64 index = state.queue.front();
|
||||
state.queue.pop();
|
||||
state.mutex_queue.unlock();
|
||||
|
||||
u64 left_child, right_child;
|
||||
state.mutex_allocator.lock();
|
||||
std::tie(left_child, right_child) =
|
||||
generate_children(state.allocator, index);
|
||||
state.mutex_allocator.unlock();
|
||||
|
||||
state.mutex_queue.lock();
|
||||
state.queue.push(left_child);
|
||||
state.queue.push(right_child);
|
||||
state.mutex_queue.unlock();
|
||||
}
|
||||
} // namespace cw::worker
|
||||
|
||||
/* Copyright (C) 2025 Aryadev Chavali
|
||||
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for
|
||||
* details.
|
||||
|
||||
* You may distribute and modify this code under the terms of the GNU General
|
||||
* Public License Version 2, which you should have received a copy of along with
|
||||
* this program. If not, please go to <https://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user