]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Error handling and parameters retrival functions added.
authorDario Faggioli <faggioli@gandalf.sssup.it>
Mon, 9 Feb 2009 10:13:38 +0000 (11:13 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 12 Feb 2009 16:03:43 +0000 (17:03 +0100)
The error handling (especially in case of bad arguments) of the FRSH
core API functions dealing with contract parameters. All the
frsh_contract_get_* variants of the (already present)
frsh_contract_set_* functions have been added too.

Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
frsh_api/frsh_contract.c

index bd97c2390a95bb8b7fbec1ad078f4f68212296a8..b97704b3f5d6306135843c52fec0dc06f4e06c80 100644 (file)
@@ -60,6 +60,22 @@ int frsh_contract_set_basic_params
                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; 
 
@@ -79,11 +95,37 @@ int frsh_contract_set_basic_params
        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;
@@ -120,6 +162,35 @@ int frsh_contract_set_resource_and_label
        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,
@@ -130,11 +201,25 @@ int frsh_contract_set_timing_reqs
    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;
        
@@ -147,6 +232,13 @@ int frsh_contract_set_timing_reqs
                        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) {
@@ -156,6 +248,42 @@ int frsh_contract_set_timing_reqs
        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)
@@ -165,6 +293,11 @@ int frsh_contract_negotiate
        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) {
@@ -183,7 +316,8 @@ int frsh_contract_negotiate
        if (ret == 0) {
                *vres = fra_get_vres(&id);
        }
-       
+
+err:   
        return ret;
 }
 
@@ -206,3 +340,20 @@ int frsh_contract_cancel (const frsh_vres_id_t vres)
 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;
+}
+