/* * Adding to the rbtree may require rotations (at least in this implementation) * This operation requires strong dependencies between numerous transactional * operations, hence, the concurrency gain with elastic transactions is slight. */ int set_add(intset_t *set, val_t val, int transactional) { int result = 0; switch(transactional) { case 0: result = rbtree_insert(set, (void *)val, (void *)val); break; case 1: case 2: /* Normal transaction */ TX_START(NL); result = TMrbtree_insert(set, (void *)val, (void *)val); TX_END; break; case 3: case 4: /* Elastic transaction */ TX_START(EL); result = TMrbtree_insert(set, (void *)val, (void *)val); TX_END; break; default: result=0; printf("number %d do not correspond to elasticity.\n", transactional); exit(1); } return result; }
int set_add(intset_t *set, intptr_t val, tx_desc *tx) { int res = 0; START_ID(0); res = !TMrbtree_insert(tx, set, val, val); COMMIT; return res; }
static int set_add(intset_t *set, val_t val, thread_data_t *td) { int result; # ifdef DEBUG printf("++> set_add(%d)\n", val); IO_FLUSH; # endif if (!td) { result = rbtree_insert((rbtree_t *)set, (void *)val, (void *)val); } else { TM_START(1, RW); result = TMrbtree_insert((rbtree_t *)set, (void *)val, (void *)val); TM_COMMIT; } return result; }