--- /dev/null
+/**
+ * @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;
+}