shared_LIBRARIES = contract
-contract_SOURCES = fres_contract.c fres_container.c fres_error.c
+contract_SOURCES = fres_contract.c fres_container.c fres_error.c contract_func.c
contract_CLIENT_IDL = fres_contract_idl.idl fres_blocks.idl
fres_contract_idl_IDLFLAGS = --include=fres_contract_type.h
--- /dev/null
+#include <fres_contract.h>
+
+/**
+ * Convenience function to retrieve a deadline from contract.
+ *
+ * Deadline in contract can be specified directly as a interval or
+ * indirectly through contract period (d_equals_t). This functions
+ * retrieves the deadline from the correct field.
+ *
+ * @param[in] contract
+ * @param[out] deadline Where to store the deadline.
+ *
+ * @return True if the contract specifies the deadline, false if not.
+ */
+bool
+fres_contract_get_deadline(const frsh_contract_t *contract,
+ frsh_rel_time_t *deadline)
+{
+ fres_block_timing_reqs *timing;
+ bool has_deadline = false;
+
+ if (!contract || !deadline) {
+ goto error;
+ }
+
+ timing = fres_contract_get_timing_reqs(*contract);
+ if (timing) {
+ if (timing->d_equals_t) {
+ fres_block_basic *basic;
+ basic = fres_contract_get_basic(*contract);
+ *deadline = basic->period;
+ } else {
+ *deadline = timing->deadline;
+ }
+ has_deadline = true;
+ }
+error:
+ return has_deadline;
+}
int
fres_contract_to_string(char *dest, size_t size, const struct fres_contract *c);
+bool
+fres_contract_get_deadline(const frsh_contract_t *contract,
+ frsh_rel_time_t *deadline);
void
fres_contract_print(char *prefix, const struct fres_contract *c);
fres_sa_scenario_for_each_contract(scenario, c) {
fres_block_cluster_tree_traffic *contract_traffic;
- fres_block_timing_reqs *timing;
+ frsh_rel_time_t deadline;
/* Extract the cumulative traffic through all contracts */
contract_traffic = fres_contract_get_block(c->contract,
}
/* Find the most restricting deadline */
- timing = fres_contract_get_timing_reqs(c->contract);
- if (timing) {
- fosa_rel_time_t deadline;
- if (timing->d_equals_t) {
- fres_block_basic *basic;
- basic = fres_contract_get_basic(c->contract);
- deadline = basic->period;
- } else {
- deadline = timing->deadline;
- }
+ if (fres_contract_get_deadline(&c->contract, &deadline)) {
if (fosa_rel_time_is_null(min_deadline) ||
fosa_rel_time_smaller(deadline, min_deadline)) {
min_deadline = deadline;
all_nodes = 0;
fres_sa_scenario_for_each_contract(scenario, c) {
fres_block_item_nodes *nodes;
- fres_block_timing_reqs *timing;
+ fosa_rel_time_t deadline;
nodes = fres_contract_get_block(c->contract, FRES_BLOCK_ITEM_NODES);
if (!nodes) return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
all_nodes |= nodes->mask;
- timing = fres_contract_get_timing_reqs(c->contract);
- if (timing) {
- fosa_rel_time_t deadline;
- if (timing->d_equals_t) {
- fres_block_basic *basic;
- basic = fres_contract_get_basic(c->contract);
- deadline = basic->period;
- } else {
- deadline = timing->deadline;
- }
+ if (fres_contract_get_deadline(&c->contract, &deadline)) {
if (fosa_rel_time_is_null(min_deadline) ||
fosa_rel_time_smaller(deadline, min_deadline)) {
min_deadline = deadline;