]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Implemented frsh_contract_renegotiate_sync()
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 23 Apr 2009 11:08:33 +0000 (13:08 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 23 Apr 2009 11:37:21 +0000 (13:37 +0200)
frsh_api/frsh_contract.c
frsh_api/tests/negotiation.c

index f3010e9cbaff892f4ba5c2586ccd7b53784bba57..c672d29424bf46fa4773d9861e823e081afcc9e1 100644 (file)
@@ -327,7 +327,7 @@ int frsh_contract_negotiate
        struct forb_env env;
        int ret;
        fres_contract_ptr_seq contracts;
-       fres_contract_ptr contracts_buf;
+       fres_contract_ptr contracts_buf[1];
        fres_contract_id_seq *ids;
        fres_block_resource *r;
 
@@ -344,8 +344,8 @@ int frsh_contract_negotiate
        }
 
        /* Negotiate contract */
-       contracts_buf = *contract;
-       contracts._buffer = &contracts_buf;
+       contracts_buf[0] = *contract;
+       contracts._buffer = contracts_buf;
        contracts._length = contracts._maximum = 1;
        ret = fres_contract_broker_negotiate_contracts(frsh_forb_global.fcb,
                                                       &contracts,
@@ -405,7 +405,47 @@ int frsh_contract_renegotiate_sync
   (const frsh_contract_t *new_contract,
    frsh_vres_id_t vres_id)
 {
-       return FRSH_ERR_NOT_IMPLEMENTED;
+       struct forb_env env;
+       struct fres_contract *contract;
+       int ret = 0;
+       fres_contract_ptr contracts_buf[1];
+       fres_contract_ptr_seq contracts;
+       fres_contract_id_seq *ids;
+       
+       if (!new_contract || !*new_contract || !vres_id) {
+               ret = FRSH_ERR_BAD_ARGUMENT;
+               goto out;
+       }
+
+       contract = fres_contract_duplicate(*new_contract);
+       if (!contract) {
+               ret = errno;
+               goto out;
+       }
+
+       /* Assign the ID, so that FCB recognises that this is
+        * renegotiation */
+       contract->id = vres_id->id;
+
+       /* Renegotiate with FCB contract */
+       contracts_buf[0] = contract;
+       contracts._buffer = contracts_buf;
+       contracts._length = contracts._maximum = 1;
+       ret = fres_contract_broker_negotiate_contracts(frsh_forb_global.fcb,
+                                                      &contracts,
+                                                      &ids, &env);
+       if (forb_exception_occurred(&env)) {
+               ret = FRES_ERR_FORB_EXCEPTION;
+               goto err;
+       }
+
+       if (CORBA_sequence_get_release(ids))
+               CORBA_free(ids->_buffer);
+       CORBA_free(ids);
+err:
+       fres_contract_destroy(contract);
+out:
+       return ret;;
 }
 
 int frsh_contract_renegotiate_async
index dc23954ef8ed48a5955865ae52216bb745b30f65..8ca18a7db6e5edc91ad58d61d1677157163ea865 100644 (file)
@@ -31,7 +31,7 @@ int main(int argc, char *argv[])
 
                budget = fosa_msec_to_rel_time(b[i]);
                period = fosa_msec_to_rel_time(100);
-               period = fosa_msec_to_rel_time(50);
+               deadline = fosa_msec_to_rel_time(50);
                ret = frsh_contract_set_basic_params(&contract[i],
                                                     &budget,
                                                     &period,
@@ -47,6 +47,20 @@ int main(int argc, char *argv[])
                ret = frsh_contract_negotiate(&contract[i], &vres[i]);
                if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
        }
+       for (i=0; i<N; i++) {
+               budget = fosa_msec_to_rel_time(2*b[i]);
+               period = fosa_msec_to_rel_time(110);
+               ret = frsh_contract_set_basic_params(&contract[i],
+                                                    &budget,
+                                                    &period,
+                                                    FRSH_WT_BOUNDED,
+                                                    FRSH_CT_REGULAR);
+               if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params reneg");
+
+               ret = frsh_contract_renegotiate_sync(&contract[i], vres[i]);
+               
+       }
+
        /* Cancel N contracts */
        for (i=0; i<N; i++) {
                ret = frsh_contract_cancel(vres[i]);