You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.4 KiB
C++

//
// Created by anton on 6/24/22.
//
#include "call_frame.h"
#include "helpers.h"
namespace pmp::core {
// public
bool call_frame::evaluate() {
std::unique_lock<std::mutex> lock(evaluation_lock, std::try_to_lock);
// check if lock was acquired
if (!lock.owns_lock()) {
return false;
}
// we now hold the lock
// only run if we are in the initial state
if (state != initial)
return false;
// set housekeeping variables
state = running;
try {
result = target_function(arguments, scope);
} catch (std::exception& ex)
{
std::cerr << "Error evaluating " << id << ": " << ex.what() << std::endl;
m_has_error = true;
}
catch (...)
{
std::cerr << "Error evaluating " << id << std::endl;
m_has_error = true;
}
// children are empty, when the "end" of an execution chain has been reached
// this means that no further nodes were created during the execution
// we don't need to acquire any lock, since no children will ever be added
if (children.empty()) {
state = completed;
parent->mark_completion();
} else {
// we do have children, so we must wait until they are finished to move on.
state = waiting;
}
return true;
}
}