1 #include <frm_generic.h>
4 #include <fres_sa_scenario.h>
7 UL_LOG_CUST(ulogd_frm);
8 ul_log_domain_t ulogd_frm = {UL_LOGL_MSG, "frm"};
11 struct fres_sa_scenario *reserved;
12 frm_adm_test_fnc_t admission_test;
16 #define object_to_frm(o) (struct frm_data*)forb_instance_data(o)
17 #define save_errno(cmd) do { int _e = errno; cmd; errno = _e; } while(0)
19 static CORBA_long reserve_contracts(fres_resource_manager obj,
20 const fres_contract_ptr_seq* contracts,
21 CORBA_Environment *ev)
23 struct frm_data *frm = object_to_frm(obj);
24 struct fres_sa_scenario *prospective;
28 ul_logmsg("reserve_contracts\n");
30 prospective = fres_sa_scenario_duplicate(frm->reserved);
31 if (!prospective) goto err;
32 for (i=0; i<contracts->_length; i++) {
33 struct fres_sa_contract *c;
34 c = fres_sa_contract_new();
36 c->status = FRES_SA_CONTRACT_NEW;
37 c->contract = fres_contract_duplicate(contracts->_buffer[i]);
38 if (!c->contract) goto err;
39 fres_sa_scenario_add_contract(prospective, c);
42 schedulable = frm->admission_test(prospective, frm->priv);
45 struct fres_sa_contract *c;
46 fres_sa_scenario_for_each_contract(prospective, c) {
47 if (c->status == FRES_SA_CONTRACT_NEW) {
48 c->status = FRES_SA_CONTRACT_RESERVED;
51 fres_sa_scenario_destroy(frm->reserved);
52 frm->reserved = prospective;
54 fres_sa_scenario_destroy(prospective);
56 return schedulable ? 0 : 1;
58 fres_sa_scenario_destroy(prospective);
62 static void commit_contracts(fres_resource_manager obj,
63 const fres_contract_id_seq* ids,
64 fres_contract_ptr_seq** contracts_with_scheduling_data,
65 CORBA_Environment *ev)
67 struct frm_data *frm = object_to_frm(obj);
69 struct fres_sa_contract *c;
70 fres_contract_ptr_seq *contracts;
72 ul_logmsg("commit_contracts\n");
74 contracts = forb_malloc(sizeof(*contracts));
76 ev->major = FORB_EX_NO_MEMORY;
80 contracts->_buffer = CORBA_sequence_fres_contract_ptr_allocbuf(num);
81 CORBA_sequence_set_release(contracts, CORBA_TRUE);
82 contracts->_maximum = contracts->_length = num;
84 for (i=0; i < num; i++) {
85 c = fres_sa_scenario_find_contract(frm->reserved, &ids->_buffer[i]);
86 c->status = FRES_SA_CONTRACT_COMMITED;
87 contracts->_buffer[i] = c->contract;
90 *contracts_with_scheduling_data = contracts;
94 static void cancel_contracts(fres_resource_manager obj,
95 const fres_contract_id_seq* ids,
96 CORBA_Environment *ev)
99 struct frm_data *frm = object_to_frm(obj);
101 ul_logmsg("cancel_contracts\n");
103 for (i=0; i<ids->_length; i++) {
104 struct fres_sa_contract *c;
105 c = fres_sa_scenario_find_contract(frm->reserved, &ids->_buffer[i]);
108 fres_sa_scenario_del_contract(frm->reserved, c);
114 static const struct forb_fres_resource_manager_impl frm_impl = {
115 .reserve_contracts = reserve_contracts,
116 .commit_contracts = commit_contracts,
117 .cancel_contracts = cancel_contracts,
121 * Initializes and runs a generic resource manager. The only thing a
122 * caller has to supply is admission test function, which is passed in
123 * @a frm_data->admission_test.
125 * @param orb FORB object used to communicate with other components.
126 * @param admission_test Admission test function.
127 * @param priv Pointer to passed as priv parameter to frm_adm_test_fnc_t.
131 int frm_register_and_run(forb_orb orb, const struct fres_res_manager *res_manager)
133 fres_contract_broker fcb;
134 fres_resource_manager frm;
136 struct frm_data frm_data;
137 forb_executor_t executor;
140 memset(&frm_data, 0, sizeof(frm_data));
141 frm_data.admission_test = res_manager->admission_test;
142 frm_data.priv = res_manager->priv;
143 frm_data.reserved = fres_sa_scenario_new();
144 if (!frm_data.reserved) {
145 save_errno(ul_logerr("fres_sa_scenario_new failed\n"));
149 fcb = forb_resolve_reference(orb, fres_contract_broker_reg_name);
151 save_errno(ul_logerr("Could not find contract broker"));
155 frm = forb_fres_resource_manager_new(orb, &frm_impl, &frm_data);
157 save_errno(ul_logerr("forb_fres_resource_manager_new error"));
158 goto err_release_fcb;
161 /* Prepare executor before we register the resource manager
162 * with contract broker */
163 ret = forb_executor_init(&executor);
165 save_errno(ul_logerr("forb_executor_init failed"));
166 goto err_release_frm;
169 ret = forb_executor_register_object(&executor, frm);
171 save_errno(ul_logerr("forb_executor_register_object failed"));
175 /* Register resource manager */
176 ret = fres_contract_broker_register_manager(fcb,
177 res_manager->res_type,
180 if (forb_exception_occured(&env) || ret != 0) {
181 save_errno(ul_logerr("fres_contract_broker_register_manager exception\n"));
185 /* Start request processing */
186 ul_logmsg("Waiting for requests\n");
187 ret = forb_executor_run(&executor);
188 if (ret) goto err_executor;
192 forb_executor_destroy(&executor);
194 forb_object_release(frm);
196 forb_object_release(fcb);