From 97df91548fc81652050e8976eac3e0ab2350862c Mon Sep 17 00:00:00 2001 From: Martin Molnar Date: Fri, 20 Jun 2008 10:56:28 +0200 Subject: [PATCH] Added fwp_mngr_contract_cancel; compilation fixes --- fwp/lib/mngt/fwp_contract.c | 15 ++++++++++++++- fwp/lib/mngt/fwp_contract.h | 13 ++++++++++++- fwp/mngr/fwp_mngr.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/fwp/lib/mngt/fwp_contract.c b/fwp/lib/mngt/fwp_contract.c index 5076b23..3d6954e 100644 --- a/fwp/lib/mngt/fwp_contract.c +++ b/fwp/lib/mngt/fwp_contract.c @@ -60,6 +60,16 @@ fwp_contract_d_t fwp_contract_create(fwp_contract_t *contract) return contdata; } +int fwp_contract_destroy(fwp_contract_d_t contractd) +{ + fwp_contract_data_t *contdata = contractd; + + if (contdata->status != FWP_CONT_NOTNEGOTIATED) + return -EPERM; + fwp_contract_data_delete(contdata); + return 0; +} + int fwp_contract_reserve(fwp_contract_d_t contractd) { fwp_contract_data_t *contdata = contractd; @@ -135,7 +145,10 @@ int fwp_contract_cancel(fwp_contract_d_t contractd) fwp_contract_data_t *contdata = contractd; fwp_msgb_t *msgb; - /* Send COMMIT to manager */ + if (contdata->status != FWP_CONT_NEGOTIATED) + return -EPERM; + + /* Send CANCEL to manager */ msgb = fwp_msgb_alloc(sizeof(struct fwp_msg_header) + sizeof(struct fwp_msg_contracthdr)); fwp_msgb_reserve(msgb, sizeof(struct fwp_msg_header)); diff --git a/fwp/lib/mngt/fwp_contract.h b/fwp/lib/mngt/fwp_contract.h index 2dfa690..f598dce 100644 --- a/fwp/lib/mngt/fwp_contract.h +++ b/fwp/lib/mngt/fwp_contract.h @@ -34,7 +34,9 @@ struct fwp_contract_data; typedef struct fwp_contract_data* fwp_contract_d_t; fwp_contract_d_t fwp_contract_create(fwp_contract_t *contract); -int fwp_contract_negotiate(fwp_contract_d_t contract, fwp_vres_d_t *vresdp); +int fwp_contract_destroy(fwp_contract_d_t contractd); +int fwp_contract_negotiate(fwp_contract_d_t contract, fwp_vres_d_t *vresdp); +int fwp_contract_cancel(fwp_contract_d_t contractd); int fwp_contract_is_negotiated(fwp_contract_d_t contract); int fwp_contract_cancel(fwp_contract_d_t contractd); @@ -90,8 +92,17 @@ static inline fwp_contract_data_t* fwp_contract_data_new() sizeof(fwp_contract_data_t)); } +static inline void fwp_contract_data_delete(fwp_contract_data_t* contdata) +{ + free(contdata); +} + int fwp_contract_reserve(fwp_contract_d_t contractd); int fwp_contract_commit(fwp_contract_d_t contractd, fwp_vres_d_t *vresdp); +/* TODO: Implement fwp_contract_set_state function + * int fwp_contract_set_state(fwp_contract_state_t state) + * */ + #endif /*_FWP_INTERNALS_ */ #endif /*_FWP_CONTRACT_H */ diff --git a/fwp/mngr/fwp_mngr.c b/fwp/mngr/fwp_mngr.c index 0565991..4670274 100644 --- a/fwp/mngr/fwp_mngr.c +++ b/fwp/mngr/fwp_mngr.c @@ -175,6 +175,35 @@ fwp_mngr_contract_commit(fwp_msgb_t *msgb, fwp_participant_id_t participant_id) return 0; } +int +fwp_mngr_contract_cancel(fwp_msgb_t *msgb, fwp_participant_id_t participant_id) +{ + fwp_participant_t *participant; + fwp_contract_data_t *contdata; + fwp_contract_id_t id; + fwp_contract_status_t status; + + /* Find participant */ + if (!(participant = fwp_participant_table_find(&participant_id))){ + return -EPERM; + } + + fwp_msg_contracthdr_out(msgb->data, &id, &status); + fwp_msgb_pull(msgb, sizeof(struct fwp_msg_contracthdr)); + + contdata = fwp_contract_table_find(&participant->contract_table, id); + contdata->status = FWP_CONT_NOTNEGOTIATED; + /* release vres */ + fwp_vres_destroy(contdata->vresd); + /* delete contract from contract table */ + fwp_contract_table_delete(&participant->contract_table, contdata); + fwp_contract_destroy(contdata); + + FWP_DEBUG("Contract id=%d to canceled\n", id); + + return 0; +} + void fwp_mngr_msg_handler(fwp_msgb_t *msgb) { fwp_msg_type_t msg_type; @@ -204,6 +233,14 @@ void fwp_mngr_msg_handler(fwp_msgb_t *msgb) participant_id.app_id); fwp_mngr_contract_commit(msgb, participant_id); break; + + case FWP_MSG_CANCEL: + FWP_DEBUG("Message CANCEL received from nodeid = %d " + "appid = %d\n", participant_id.node_id, + participant_id.app_id); + fwp_mngr_contract_cancel(msgb, participant_id); + break; + default: printf("Invalid message\n."); fwp_msgb_free(msgb); -- 2.39.2