Example #1
0
/* 
 * 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;
}
Example #2
0
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;
}
Example #3
0
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;
}