int set_add(intset_t *set, skey_t key, skey_t val) { int result; #ifdef DEBUG_PRINT printf("++> set_add(%d)\n", (int)val); IO_FLUSH; #endif #ifdef SEQUENTIAL /* Unprotected */ result = set_seq_add(set, key, val); #elif defined LOCKFREE result = harris_insert(set, key, val); #endif return result; }
int set_add(intset_t *set, val_t val, int transactional) { int result = 0; #ifdef DEBUG printf("++> set_add(%d)\n", (int)val); IO_FLUSH; #endif if (!transactional) { result = set_seq_add(set, val); } else { #ifdef SEQUENTIAL /* Unprotected */ result = set_seq_add(set, val); #elif defined STM node_t *prev, *next; val_t v; TX_START(EL); prev = set->head; next = (node_t *)TX_LOAD(&prev->next); while (1) { v = TX_LOAD((uintptr_t *) &next->val); if (v >= val) break; prev = next; next = (node_t *)TX_LOAD(&prev->next); } result = (v != val); if (result) { TX_STORE(&prev->next, new_node(val, next, transactional)); } TX_END; #elif defined LOCKFREE result = harris_insert(set, val); #endif } return result; }
int set_add(intset_t *set, skey_t key, skey_t val) { int result; result = harris_insert(set, key, val); return result; }