}
+GAVL_CUST_NODE_INT_DEC(fres_sa_scenario_contract /* cust_prefix */,
+ struct fres_sa_scenario /* cust_root_t */,
+ struct fres_sa_contract /* cust_item_t */,
+ fres_contract_id_t /* cust_key_t */,
+ contracts /* cust_root_node */,
+ node /* cust_item_node */,
+ contract->id /* cust_item_key */,
+ fres_contract_id_cmp /* cust_cmp_fnc */)
+
GAVL_CUST_NODE_INT_IMP(fres_sa_scenario_contract /* cust_prefix */,
struct fres_sa_scenario /* cust_root_t */,
struct fres_sa_contract /* cust_item_t */,
}
int fres_sa_scenario_del_contract(struct fres_sa_scenario *scenario,
- fres_contract_id_t *id)
+ struct fres_sa_contract *c)
{
- struct fres_sa_contract *c;
- c = fres_sa_scenario_contract_find(scenario, id);
- if (c) {
+ if (scenario && c) {
scenario->num_contracts--;
fres_sa_scenario_contract_delete(scenario, c);
return 1;
}
return 0;
}
+
+struct fres_sa_contract *
+fres_sa_scenario_find_contract(struct fres_sa_scenario *scenario,
+ fres_contract_id_t *id)
+{
+ return fres_sa_scenario_contract_find(scenario, id);
+}
void *priv;
};
-
-GAVL_CUST_NODE_INT_DEC(fres_sa_scenario_contract /* cust_prefix */,
- struct fres_sa_scenario /* cust_root_t */,
- struct fres_sa_contract /* cust_item_t */,
- fres_contract_id_t /* cust_key_t */,
- contracts /* cust_root_node */,
- node /* cust_item_node */,
- contract->id /* cust_item_key */,
- fres_contract_id_cmp /* cust_cmp_fnc */)
-
struct fres_sa_contract *
fres_sa_contract_new(void);
int fres_sa_scenario_add_contract(struct fres_sa_scenario *scenario,
struct fres_contract *contract);
-
+int fres_sa_scenario_del_contract(struct fres_sa_scenario *scenario,
+ struct fres_sa_contract *contract);
+
+struct fres_sa_contract *
+fres_sa_scenario_find_contract(struct fres_sa_scenario *scenario,
+ fres_contract_id_t *id);
#endif
shared_LIBRARIES = frsh
-frsh_SOURCES = frsh_contract.c frsh_distributed.c
+frsh_SOURCES = frsh_contract.c frsh_distributed.c frsh_core.c
include_HEADERS = frsh_opaque_types.h
lib_LOADLIBES+= fna
#include <frsh_error.h>
#include <fres_blocks.h>
#include <string.h>
+#include <fcb.h>
+#include "frsh_forb.h"
/**********************************/
/* -----===== FRSH API =====----- */
}
return 0;
}
+
+int frsh_contract_negotiate
+ (const frsh_contract_t *contract,
+ frsh_vres_id_t *vres)
+{
+ struct forb_env env;
+ int ret;
+ ret = fres_contract_broker_negotiate_contract(global.fcb,
+ *contract,
+ vres, &env);
+ if (forb_exception_occured(&env)) {
+ ret = FRSH_ERR_INTERNAL_ERROR;
+ }
+ return ret;
+}
--- /dev/null
+#include <frsh_core.h>
+#include <fcb.h>
+#include <forb.h>
+#include "frsh_forb.h"
+
+struct frsh_forb global;
+
+int frsh_init()
+{
+ global.orb = forb_init(NULL, NULL, "frsh");
+ if (!global.orb) {
+ if (errno) return errno;
+ else return -1;
+ }
+
+ global.fcb = forb_resolve_reference(global.orb,
+ fres_contract_broker_reg_name);
+ if (!global.fcb) return FRSH_ERR_NOT_INITIALIZED;
+
+ return 0;
+}
--- /dev/null
+#ifndef FRSH_FORB_H
+#define FRSH_FORB_H
+
+struct frsh_forb {
+ forb_orb orb;
+ fres_contract_broker fcb;
+};
+
+extern struct frsh_forb global;
+
+
+#endif
// FRSH(FRescor ScHeduler), pronounced "fresh"
//==============================================
-#ifdef FRSH_CORE_TYPES_H_
-#define frsh_vres_id_t frsh_vres_id_t_old
-#endif
-
// Implementation dependent definitions
#ifndef _FRSH_OPAQUE_TYPES_H_
#define _FRSH_OPAQUE_TYPES_H_
#include <fres_contract_type.h>
#include <frsh_cpp_macros.h>
+#include <fres_contract_idl.h>
FRSH_CPP_BEGIN_DECLS
* @{
**/
+#define FRSH_VRES_ID_T_OPAQUE fres_contract_id_t
+
/** frsh_contract_parameters_t **/
#define FRSH_CONTRACT_T_OPAQUE fres_contract_ptr
shared_LIBRARIES = frs_dummy
frm_dummy_SOURCES = frm_dummy.c
-frm_dummy_LIBS = frm fres_sa forb contract fosa rt ulut
+frm_dummy_LIBS = frm fres_sa forb contract fosa rt ulut fcb_client
frs_dummy_SOURCES = frs_dummy.c
frs_dummy_LIBS = frs
#include <fres_sa_scenario.h>
#include <stdbool.h>
#include <fcb.h>
+#include <ul_log.h>
+
+UL_LOG_CUST(ulogd_frm_dummy);
+ul_log_domain_t ulogd_frm_dummy = {UL_LOGL_MSG, "frm_dummy"};
+
bool admission_test(struct fres_sa_scenario *scenario)
{
bool schedulable;
+ ul_logmsg("Admission test");
schedulable = scenario->num_contracts <= 3;
return schedulable;
struct fres_contract *c;
bool schedulable;
int i;
+
+ ul_logdeb("reserve_contracts\n");
prospective = fres_sa_scenario_duplicate(frm->running);
for (i=0; i<contracts->_length; i++) {
struct fres_sa_contract *c;
fres_contract_ptr_seq *contracts;
+ ul_logdeb("commit_contracts\n");
+
contracts = forb_malloc(sizeof(*contracts));
if (!contracts) {
ev->major = FORB_EX_NO_MEMORY;
contracts->_maximum = contracts->_length = num;
for (i=0; i < num; i++) {
- c = fres_sa_scenario_contract_find(frm->running, &ids->_buffer[i]);
+ c = fres_sa_scenario_find_contract(frm->running, &ids->_buffer[i]);
}
*contract_with_scheduler_data = contracts;
int i;
struct frm_data *frm = object_to_frm(obj);
+ ul_logdeb("cancel_contracts\n");
+
for (i=0; i<ids->_length; i++) {
struct fres_sa_contract *c;
- c = fres_sa_scenario_contract_find(frm->running, &ids->_buffer[i]);
+ c = fres_sa_scenario_find_contract(frm->running, &ids->_buffer[i]);
if (c) {
- fres_sa_scenario_contract_delete(frm->running, c);
+ fres_sa_scenario_del_contract(frm->running, c);
}
}
}
-const struct forb_fres_resource_manager_impl impl = {
+const struct forb_fres_resource_manager_impl dummy_impl = {
.reserve_contracts = reserve_contracts,
.commit_contracts = commit_contracts,
.cancel_contracts = cancel_contracts,
forb_orb orb;
fres_contract_broker fcb;
fres_resource_manager frm;
+ struct forb_env env;
struct frm_data dummy_data;
fcb = forb_resolve_reference(orb, fres_contract_broker_reg_name);
if (!fcb) error(1, 0, "Could not find contract broker");
- frm = forb_fres_resource_manager_new(orb, &impl, &dummy_data);
+ frm = forb_fres_resource_manager_new(orb, &dummy_impl, &dummy_data);
if (!frm) error(1, errno, "forb_fres_resource_manager_new");
+ fres_contract_broker_register_manager(fcb, FRSH_RT_PROCESSOR, 0,
+ frm, &env);
+
forb_execute_object(frm);
return 0;