sval_t set_remove(intset_t *set, skey_t key) { sval_t result = 0; #ifdef DEBUG_PRINT printf("++> set_remove(%d)\n", (int)val); IO_FLUSH; #endif #ifdef SEQUENTIAL /* Unprotected */ node_t *prev, *next; prev = set->head; next = prev->next; while (next->key < key) { prev = next; next = prev->next; } result = (next->key == key) ? next->val : 0; if (result) { prev->next = next->next; free(next); } #elif defined LOCKFREE result = harris_delete(set, key); #endif return result; }
int set_remove(intset_t *set, val_t val, int transactional) { int result = 0; #ifdef DEBUG printf("++> set_remove(%d)\n", (int)val); IO_FLUSH; #endif #ifdef SEQUENTIAL /* Unprotected */ node_t *prev, *next; prev = set->head; next = prev->next; while (next->val < val) { prev = next; next = prev->next; } result = (next->val == val); if (result) { prev->next = next->next; free(next); } #elif defined STM node_t *prev, *next; val_t v; node_t *n; 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) { n = (node_t *)TX_LOAD(&next->next); TX_STORE(&prev->next, n); FREE(next, sizeof(node_t)); } TX_END; #elif defined LOCKFREE result = harris_delete(set, val); #endif return result; }
sval_t set_remove(intset_t *set, skey_t key) { sval_t result = 0; result = harris_delete(set, key); return result; }