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: