]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
FRM: Added get_contracts() method
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 10 Feb 2009 14:13:11 +0000 (15:13 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 10 Feb 2009 14:13:11 +0000 (15:13 +0100)
fres/resmng/frm.idl
fres/resmng/frm_generic.c

index cd5a049e7de0dd9b020db9685d3d37c45e5c0795..2a1dc37f7d3e1e17da47c0bb180efc2aca78ed97 100644 (file)
@@ -51,6 +51,17 @@ module fres {
                void commit_contracts(in contract::id_seq ids,
                                      out contract::ptr_seq schedulable_contracts);
                void cancel_contracts(in contract::id_seq ids);
+
+               /** 
+                * Returns the list of commited contracts
+                * 
+                * @param contracts Commited contracts
+                * 
+                * @param utilization Utilization in the range 0-100
+                * (for visualization) or -1 if utilization cannot be
+                * calculated.
+                */
+               void get_contracts(out contract::ptr_seq contracts, out long utilization);
        };
 };
 
index 8ee93178923e94d0b565bdfb50885d19349c8bd6..f359e13715ae669c73a49059a09d2e759a00c18c 100644 (file)
@@ -165,11 +165,42 @@ static void cancel_contracts(fres_resource_manager obj,
        }
 }
 
+static void get_contracts(fres_resource_manager obj,
+                         fres_contract_ptr_seq** contracts_out,
+                         CORBA_long* utilization, CORBA_Environment *ev)
+{
+       struct frm_data *frm = object_to_frm(obj);
+       struct fres_sa_contract *c;
+       fres_contract_ptr_seq *contracts;
+
+       contracts = forb_malloc(sizeof(*contracts));
+       if (!contracts) {
+               ev->major = FORB_EX_NO_MEMORY;
+               goto err;
+       }
+       contracts->_buffer = CORBA_sequence_fres_contract_ptr_allocbuf(frm->scenario->num_contracts);
+       CORBA_sequence_set_release(contracts, CORBA_TRUE);
+       contracts->_maximum = frm->scenario->num_contracts;
+       contracts->_length = 0;
+
+       fres_sa_scenario_for_each_contract(frm->scenario, c) {
+               if (c->committed) {
+                       int i = contracts->_length;
+                       contracts->_buffer[i] = fres_contract_duplicate(c->committed);
+                       contracts->_length++;
+               }
+                                       
+       }
+       *contracts_out = contracts;
+err:;
+}
+
 
 static const struct forb_fres_resource_manager_impl frm_impl = {
        .reserve_contracts = reserve_contracts,
        .commit_contracts  = commit_contracts,
        .cancel_contracts  = cancel_contracts,
+       .get_contracts  = get_contracts,
 };
 
 /**