return FRSH_ERR_BAD_ARGUMENT;
}
+ if ((fosa_rel_time_is_null(*period_max) &&
+ !fosa_rel_time_is_null(*budget_min)) ||
+ (!fosa_rel_time_is_null(*period_max) &&
+ fosa_rel_time_is_null(*budget_min)) ||
+ fosa_rel_time_smaller(*period_max, *budget_min))
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ if (workload != FRSH_WT_BOUNDED &&
+ workload != FRSH_WT_INDETERMINATE)
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ if (contract_type != FRSH_CT_REGULAR &&
+ workload != FRSH_CT_BACKGROUND &&
+ workload != FRSH_CT_DUMMY)
+ return FRSH_ERR_BAD_ARGUMENT;
+
b = malloc(sizeof(*b));
if (!b) return ENOMEM;
return 0;
}
+int frsh_contract_get_basic_params
+ (const frsh_contract_t *contract,
+ frsh_rel_time_t *budget_min,
+ frsh_rel_time_t *period_max,
+ frsh_workload_t *workload,
+ frsh_contract_type_t *contract_type)
+{
+ fres_block_basic *b;
+
+ if (!contract || !*contract)
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ b = fres_contract_get_basic(*contract);
+
+ if (workload)
+ *workload = b->workload;
+ if (budget_min)
+ *budget_min = b->budget;
+ if (period_max)
+ *period_max = b->period;
+ if (contract_type)
+ *contract_type = b->contract_type;
+
+ return 0;
+}
+
int frsh_contract_set_resource_and_label
(frsh_contract_t *contract,
const frsh_resource_type_t resource_type,
const frsh_resource_id_t resource_id,
- const char *contract_label)
+ const frsh_contract_label_t contract_label)
{
fres_block_label *label;
fres_block_resource *r;
return 0;
}
+int frsh_get_resource_and_label
+ (const frsh_contract_t *contract,
+ frsh_resource_type_t *resource_type,
+ frsh_resource_id_t *resource_id,
+ frsh_contract_label_t contract_label)
+{
+ fres_block_resource *r;
+ fres_block_label *label;
+
+ if (!contract || !*contract)
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ if (resource_type || resource_id) {
+ r = fres_contract_get_resource(*contract);
+ if (resource_type)
+ *resource_type = r->resource_type;
+ if (resource_id)
+ *resource_id = r->resource_id;
+ }
+
+ if (contract_label) {
+ label = fres_contract_get_label(*contract);
+ strncpy(contract_label, label->label, sizeof(label->label));
+ contract_label[sizeof(label->label)-1] = '\0';
+ }
+
+ return 0;
+}
+
int frsh_contract_set_timing_reqs
(frsh_contract_t *contract,
const bool d_equals_t,
const frsh_signal_info_t deadline_miss_siginfo)
{
int ret;
+ fres_block_basic *b;
fres_block_timing_reqs *t;
if (!contract || !*contract)
return FRSH_ERR_BAD_ARGUMENT;
+ /* deadline and period must be coherent between each other */
+ b = fres_contract_get_basic(*contract);
+
+ if ((d_equals_t && deadline != FRSH_NULL_DEADLINE) ||
+ (!d_equals_t && (deadline == FRSH_NULL_DEADLINE)))
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ /* signal delivery can only be requested for BUONDED workloads */
+ if (b->workload == FRSH_WT_INDETERMINATE &&
+ (deadline_miss_signal != FRSH_NULL_SIGNAL ||
+ budget_overrun_signal != FRSH_NULL_SIGNAL))
+ return FRSH_ERR_BAD_ARGUMENT;
+
t = malloc(sizeof(*t));
if (!t) return ENOMEM;
return FRSH_ERR_BAD_ARGUMENT;
}
}
+
+ /* Signals are currently ignored by this implementation as
+ * they are better implemented in frsh_thread_bind() */
+ /*t->budget_overrun_signal = budget_overrun_signal;
+ t->budget_overrun_siginfo = budget_overrun_siginfo;
+ t->deadline_miss_signal = deadline_miss_signal;
+ t->deadline_miss_siginfo = deadline_miss_siginfo;*/
fres_contract_del_timing_reqs(*contract);
ret = fres_contract_add_timing_reqs(*contract, t);
if (ret) {
return 0;
}
+int frsh_contract_get_timing_reqs
+ (const frsh_contract_t *contract,
+ bool *d_equals_t,
+ frsh_rel_time_t *deadline,
+ frsh_signal_t *budget_overrun_signal,
+ frsh_signal_info_t *budget_overrun_siginfo,
+ frsh_signal_t *deadline_miss_signal,
+ frsh_signal_info_t *deadline_miss_siginfo)
+{
+ fres_block_timing_reqs *t;
+
+ if (!contract || !*contract)
+ return FRSH_ERR_BAD_ARGUMENT;
+
+ t = fres_contract_get_timing_reqs(*contract);
+
+ if (d_equals_t)
+ *d_equals_t = t->d_equals_t;
+
+ if (deadline)
+ *deadline = t->deadline;
+
+ /*if (budget_overrun_signal) {
+ *budget_overrun_signal = t->budget_overrun_signal;
+ if (budget_overrun_siginfo)
+ *budget_overrun_siginfo = t->budget_overrun_siginfo;
+ }
+ if (deadline_miss_signal) {
+ *deadline_miss_signal = t->deadline_miss_signal;
+ if (deadline_miss_siginfo)
+ *deadline_miss_siginfo = t->deadline_miss_siginfo;
+ }*/
+
+ return 0;
+}
+
int frsh_contract_negotiate
(const frsh_contract_t *contract,
frsh_vres_id_t *vres)
fres_contract_id_t id;
fres_block_resource *r;
+ if (!contract || !*contract || !vres) {
+ ret = FRSH_ERR_BAD_ARGUMENT;
+ goto err;
+ }
+
/* Activate allocator */
r = fres_contract_get_resource(*contract);
if (r) {
if (ret == 0) {
*vres = fra_get_vres(&id);
}
-
+
+err:
return ret;
}
err:
return ret;
}
+
+int frsh_contract_renegotiate_sync
+ (const frsh_contract_t *new_contract,
+ frsh_vres_id_t vres_id)
+{
+ return FRSH_ERR_NOT_IMPLEMENTED;
+}
+
+int frsh_contract_renegotiate_async
+ (const frsh_contract_t *new_contract,
+ frsh_vres_id_t vres,
+ frsh_signal_t signal_to_notify,
+ frsh_signal_info_t signal_info)
+{
+ return FRSH_ERR_NOT_IMPLEMENTED;
+}
+