]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
ITEM protocol partially integrated
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 6 Nov 2008 17:31:36 +0000 (18:31 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 6 Nov 2008 17:31:36 +0000 (18:31 +0100)
Manager can be compiled, but it is not tested. Scheduler will be
implemented later.

fres/contract/fres_container.h
fres/contract/fres_error.h
resources/item/Makefile
resources/item/frm_item.c [new file with mode: 0644]
resources/item/item.h [new file with mode: 0644]
resources/item/item_blocks.c [new file with mode: 0644]
resources/item/item_idl.idl [new file with mode: 0644]

index b51ab766a9a0c4c8e3f6545f6b6fab2b383562a2..3259f47c71b041b758e298680dbe5cd9b9ce8e5f 100644 (file)
@@ -36,6 +36,7 @@ enum fres_block_type {
        FRES_BLOCK_DUMMY_SCHED, /**< See resources/dummy/res_dummy_idl.idl */
        FRES_BLOCK_CLUSTER_TREE_TRAFFIC, /**< resources/cluster_tree/cluster_tree_idl.idl */
        FRES_BLOCK_FWP_SCHED,
+       FRES_BLOCK_ITEM_NODES, /**< resources/item/item_idl.idl */
        FRES_NUM_BLOCKS
 };
 
index dc361efa1799417d126f696f5094713f6945f52c..359e7ab8f59787bd72386ebac727b71bc5873f48 100644 (file)
@@ -7,6 +7,7 @@ enum fres_error {
        FRES_ERR_FCB_NOT_RUNNING = FRES_ERR_BASE_VALUE,
        FRES_ERR_FORB_EXCEPTION,
        FRES_ERR_BLOCK_NOT_REGISTERED,
+       FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT,
 };
 
 int fres_strerror (int error, char *message, size_t size);
index 7ffbc168cc42cfd2aec70baacb488bbb13b8e4c4..510585b3011e42417b9a3d56ef625edb84e6eb5e 100755 (executable)
@@ -1,3 +1,4 @@
+# Makefile for standalone build (without OMK)\r
 CC=gcc\r
 CFLAGS=-g -std=c99 -pedantic -Wall\r
 \r
diff --git a/resources/item/frm_item.c b/resources/item/frm_item.c
new file mode 100644 (file)
index 0000000..b106a59
--- /dev/null
@@ -0,0 +1,180 @@
+/**
+ * @file   frm_item.c
+ * @author Michal Sojka <sojkam1@fel.cvut.cz>
+ * @date   Thu Nov  6 17:21:48 2008
+ * 
+ * @brief  Resource manager for ITEM protocol
+ * 
+ * 
+ */
+#include <frm_generic.h>
+#include <forb.h>
+#include <error.h>
+#include <errno.h>
+#include <fres_sa_scenario.h>
+#include <stdbool.h>
+#include <ul_log.h>
+#include <stdio.h>
+#include <frsh_distributed.h>
+#include <item.h>
+
+
+
+static inline bool node_present(fres_item_node_mask nodes, int node)
+{
+       return (nodes & (1LL<<node)) != 0;
+}
+
+static inline void node_add(fres_item_node_mask *nodes, int node)
+{
+       *nodes |= (1LL<<node);
+}
+
+static inline void node_del(fres_item_node_mask *nodes, int node)
+{
+       *nodes &= (~(1LL<<node));
+}
+
+static int
+admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
+{
+       struct fres_sa_contract *c;
+       fres_item_node_mask all_nodes;
+       frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
+
+       /* Find communicating nodes and the most restricting deadline */
+       all_nodes = 0;
+       fres_sa_scenario_for_each_contract(scenario, c) {
+               fres_block_item_nodes *nodes;
+               fres_block_timing_reqs *timing;
+
+               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 (fosa_rel_time_is_null(min_deadline) ||
+                           fosa_rel_time_smaller(deadline, min_deadline)) {
+                               min_deadline = deadline;
+                       }
+               }
+       }
+
+       if (!fosa_rel_time_is_null(min_deadline)) {
+               /* TODO: Compare number of nodes and min_deadline */
+               *schedulable = false;
+       } else {
+               *schedulable = true;
+       }
+
+       return 0;
+}
+
+struct item_status {
+       /** Specifies how many applications want to read from a which
+        * node */
+       int node_requested[64];
+};
+
+CORBA_long
+add_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
+{
+       int node;
+       struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
+
+       for (node=0; node<64; node++) {
+               if (node_present(mask, node)) {
+                       if (item_status->node_requested[node] == 0)
+                       {
+                               /* TODO: Add node */
+                       }
+                       item_status->node_requested[node]++;
+               }
+       }
+       return /* TODO */ 0;
+}
+
+CORBA_long
+del_nodes(fres_item_scheduler obj, const fres_item_node_mask mask, CORBA_Environment *ev)
+{
+       struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
+       int node;
+
+       for (node=0; node<64; node++) {
+               if (node_present(mask, node)) {
+                       item_status->node_requested[node]--;
+                       if (item_status->node_requested[node] == 0)
+                       {
+                               /* TODO: Remove node */
+                       }
+               }
+       }
+       return 0;
+}
+
+CORBA_long
+get_data(fres_item_scheduler obj, const fres_item_node_mask mask, fres_item_data_seq** data, CORBA_Environment *ev)
+{
+       //struct item_status *item_status = (struct item_status*)forb_instance_data(obj);
+       /* TODO: */
+       return 0;
+}
+
+static const struct fres_res_manager frm_item_desc = {
+       .res_type = FRSH_RT_NETWORK,
+       .res_id = FRSH_NETPF_ITEM,
+       .admission_test = admission_test,
+       .priv = NULL,
+};
+
+static const struct forb_fres_item_scheduler_impl item_scheduler_impl = {
+       .add_nodes = add_nodes,
+       .del_nodes = del_nodes,
+       .get_data  = get_data,
+};
+
+struct item_status item_status;
+
+int main(int argc, char *argv[])
+{
+       forb_orb orb;
+       int ret;
+       forb_executor_t executor;
+       fres_resource_manager frm;
+       fres_item_scheduler fis;
+       struct frm_data frm_data;
+
+       orb = forb_init(&argc, &argv, "frm_item");
+       if (!orb) error(1, errno, "forb_init");
+
+       fres_block_register_item();
+
+       ret = forb_executor_init(&executor);
+       if (ret) error(1, errno, "forb_executor_init failed");
+       
+       frm = frm_register(orb, &frm_data, &executor, &frm_item_desc);
+       if (frm != 0) {
+               error(1, errno, "frm_register failed");
+       }
+
+       fis = forb_fres_item_scheduler_new(orb, &item_scheduler_impl, &item_status);
+       if (!fis) error(1, errno, "Cannot create item scheduler");
+
+       ret = forb_register_reference(fis, "item_scheduler");
+       if (ret==0) error (1, errno, "Cannot register ITEM scheduler");
+
+       forb_executor_register_object(&executor, fis);
+
+       forb_executor_run(&executor);
+       
+       return 0;
+}
diff --git a/resources/item/item.h b/resources/item/item.h
new file mode 100644 (file)
index 0000000..eecdeac
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef ITEM_H
+#define ITEM_H
+
+#include <item_idl.h>
+
+
+int fres_block_register_item();
+
+
+#endif
diff --git a/resources/item/item_blocks.c b/resources/item/item_blocks.c
new file mode 100644 (file)
index 0000000..c11110c
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * @file   item_blocks.c
+ * @author Michal Sojka <sojkam1@fel.cvut.cz>
+ * @date   Fri Oct 31 17:23:25 2008
+ * 
+ * @brief  Description contract blocks specific to ITEM resource.
+ */
+#include <item.h>
+#include <fres_container.h>
+
+static const struct fres_block_desc item_nodes_desc = {
+       .size = sizeof(fres_block_item_nodes),
+       .serialize = (fres_block_serialize_fnc_t*)fres_block_item_nodes_serialize,
+       .deserialize = (fres_block_deserialize_fnc_t*)fres_block_item_nodes_deserialize,
+       .duplicate = fres_block_duplicate_default
+};
+
+int fres_block_register_item()
+{
+       return fres_block_register(FRES_BLOCK_ITEM_NODES,
+                                  &item_nodes_desc);
+}
diff --git a/resources/item/item_idl.idl b/resources/item/item_idl.idl
new file mode 100644 (file)
index 0000000..202f020
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * @file   item_idl.idl
+ * @author Michal Sojka <sojkam1@fel.cvut.cz>
+ * @date   Fri Oct 31 17:17:49 2008
+ * 
+ * @brief  
+ * 
+ * 
+ */
+module fres {
+       module item {
+               typedef unsigned long long node_mask;
+               typedef sequence<unsigned long> data_seq;
+               interface scheduler {
+                       /** Adds given nodes to network and stats receiving data from them */
+                       long add_nodes(in node_mask mask);
+                       /** Diconnectes given nodes from network and stops receiving data from them */
+                       long del_nodes(in node_mask mask);
+                       /** Returns last data received form the given nodes */
+                       long get_data(in node_mask mask, out data_seq data);
+               };
+       };
+       module block {
+               module item {
+                       struct nodes {
+                               /** A bit set to 1 means we want to
+                                * receive data from that node. */
+                               fres::item::node_mask mask;
+                       };
+               };
+       };
+};