X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/frsh.git/blobdiff_plain/6af520702e1d3f606bfc3994470310ef5976fa19..b403fa002a1bbb0ade17285cf98d0959f086c407:/fres/cbroker/fcb.c diff --git a/fres/cbroker/fcb.c b/fres/cbroker/fcb.c index 5d7018d..40b17eb 100644 --- a/fres/cbroker/fcb.c +++ b/fres/cbroker/fcb.c @@ -1254,12 +1254,37 @@ negotiate_transaction(fres_contract_broker _obj, ret = errno; goto err_cancel_reservation; } + enum { NONE, CANCELATION, NEGOTIATION } op = NONE; for (i = 0; i < num; i++) { - tran_contract_insert_at(ft, fcb_contracts[i], i); - fcb_contracts[i]->transaction = ft; + fc = fcb_contracts[i]; + if (fc->requested_contract && + fres_contract_get_num_blocks(fc->requested_contract) == 0) { + assert(i == 0 || op == CANCELATION); + op = CANCELATION; + /* TODO: Review and test transaction cancelation!!! */ + fcb_contract_delete(fcb, fc); + /* Note: requested_contract is also pointed by + * contracts parameter and will be freed by FORB. */ + fc->requested_contract = NULL; + fcb_contract_destroy(fc); + } else { + assert(i == 0 || op == NEGOTIATION); + op = NEGOTIATION; + tran_contract_insert_at(ft, fc, i); + fc->transaction = ft; + } + } + switch (op) { + case NEGOTIATION: + fcb_transaction_insert(fcb, ft); + break; + case CANCELATION: + fcb_transaction_delete(fcb, ft); + fcb_transaction_destroy(ft); + break; + default: + assert(false); } - fcb_transaction_insert(fcb, ft); - res_array_delete_all(&res_array); return 0; err_cancel_reservation: