]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Added fres_contract_get_deadline() convenience function
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 21 Nov 2008 10:06:47 +0000 (11:06 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 21 Nov 2008 10:06:47 +0000 (11:06 +0100)
fres/contract/Makefile.omk
fres/contract/contract_func.c [new file with mode: 0644]
fres/contract/fres_contract.h
resources/cluster_tree/frm_cluster_tree.c
resources/item/frm_item.c

index 1a8a1908175722b728df03778c4c6bb6c097055a..ad001533f27b8c2640575e9a09e0f64b880ce604 100644 (file)
@@ -1,6 +1,6 @@
 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
diff --git a/fres/contract/contract_func.c b/fres/contract/contract_func.c
new file mode 100644 (file)
index 0000000..d651a69
--- /dev/null
@@ -0,0 +1,39 @@
+#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;
+}
index d3a4df5c47f40424c365e6d690ae7b90fc2c1df0..b74d046f22ee9a3f65f3c6f12854a6fa1ca91e15 100644 (file)
@@ -67,6 +67,9 @@ fres_contract_get_block(struct fres_contract *contract,
 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);
 
index 05ef284ca2976a28946a0672f3aedda2fd3f1855..bfeccd2956840f0192a5cca70e2fa0773ebc052d 100644 (file)
@@ -42,7 +42,7 @@ int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedula
 
        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,
@@ -54,16 +54,7 @@ int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedula
                }               
 
                /* 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;
index 5d26dbb5c488441ca197c0cf6a75ffe45f439531..09cf9147521041169ce3aef0fdd10519a76f3af6 100644 (file)
@@ -46,22 +46,13 @@ admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
        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;