]> rtime.felk.cvut.cz Git - frescor/fwp.git/commitdiff
Added fwp_mngr_contract_cancel; compilation fixes
authorMartin Molnar <molnar@sum.(none)>
Fri, 20 Jun 2008 08:56:28 +0000 (10:56 +0200)
committerMartin Molnar <molnar@sum.(none)>
Fri, 20 Jun 2008 08:56:28 +0000 (10:56 +0200)
fwp/lib/mngt/fwp_contract.c
fwp/lib/mngt/fwp_contract.h
fwp/mngr/fwp_mngr.c

index 5076b237c1f54a512112fb5a3a2987fe371027f1..3d6954e4c503c9afc4e4753d5b9dfa34630fc6ff 100644 (file)
@@ -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));
index 2dfa69010d1ecec4e3dcf6bcba64461bf1955b65..f598dce82fe5b324d2d4c619aedc8eb3464e71b6 100644 (file)
@@ -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 */ 
index 0565991fd160c83639f7f8bad0e7ea6a85434d66..46702746f115c5a2da9d545c4c8059294a927068 100644 (file)
@@ -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);