2 * @file fres_transaction.c
3 * @author Michal Sojka <sojkam1@fel.cvut.cz>
4 * @date Mon Jun 21 16:34:00 2010
6 * @brief Distributed transaction manipulation
9 #include <fres_transaction.h>
12 * Allocates new transaction.
14 * @return Pointer to the newly allocated transaction or NULL in case
18 fres_transaction_new()
20 fres_transaction_t *t;
22 t = malloc(sizeof(*t));
25 memset(t, 0, sizeof(*t));
26 CORBA_sequence_set_release(&t->contracts, CORBA_TRUE);
33 fres_transaction_destroy(fres_transaction_t *t)
36 forb_sequence_free_buf(&t->contracts, fres_contract_ptr_destroy);
43 fres_transaction_duplicate(fres_transaction_t *src)
45 fres_transaction_t *dst;
50 dst = malloc(sizeof(*dst));
51 /* Copy all static mambers */
52 memcpy(dst, src, sizeof(*dst));
53 /* And now the dynamic ones */
55 dst->name = strdup(src->name);
56 forb_sequence_alloc_buf(&dst->contracts,
57 fres_transaction_num_contracts(src));
58 for (i = 0; i < fres_transaction_num_contracts(src); i++) {
59 struct fres_contract *c;
60 c = fres_transaction_get_contract(src, i);
61 fres_transaction_add_contract(dst, fres_contract_duplicate(c));
69 fres_transaction_add_contract(fres_transaction_t *t,
70 struct fres_contract *c)
73 unsigned num = forb_sequence_length(&t->contracts);
74 ptr = forb_sequence_ensure_allocated(&t->contracts, num+1);
77 forb_sequence_elem(&t->contracts, num) = c;
78 forb_sequence_length(&t->contracts)++;
79 return forb_sequence_length(&t->contracts);