bool_t bst_help_relocate(operation_t* op, node_t* pred, operation_t* pred_op, node_t* curr, node_t* root){ CLEANUP_TRY(); int seen_state = op->relocate_op.state; if (seen_state == STATE_OP_ONGOING) { // VCAS in original implementation operation_t* seen_op = CAS_PTR(&(op->relocate_op.dest->op), op->relocate_op.dest_op, FLAG(op, STATE_OP_RELOCATE)); if ((seen_op == op->relocate_op.dest_op) || (seen_op == (operation_t *)FLAG(op, STATE_OP_RELOCATE))){ CAS_U32(&(op->relocate_op.state), STATE_OP_ONGOING, STATE_OP_SUCCESSFUL); seen_state = STATE_OP_SUCCESSFUL; if (seen_op == op->relocate_op.dest_op) { #if GC == 1 if (UNFLAG(seen_op)!=0) ssmem_free(alloc,(void*)UNFLAG(seen_op)); #endif } } else { // VCAS in original implementation seen_state = CAS_U32(&(op->relocate_op.state), STATE_OP_ONGOING, STATE_OP_FAILED); } } if (seen_state == STATE_OP_SUCCESSFUL) { skey_t UNUSED dummy0 = CAS_PTR(&(op->relocate_op.dest->key), op->relocate_op.remove_key, op->relocate_op.replace_key); skey_t UNUSED dummy1 = CAS_PTR(&(op->relocate_op.dest->value), op->relocate_op.remove_value, op->relocate_op.replace_value); void* UNUSED dummy2 = CAS_PTR(&(op->relocate_op.dest->op), FLAG(op, STATE_OP_RELOCATE), FLAG(op, STATE_OP_NONE)); }
int alock_trylock(array_lock_t* local_lock) { lock_shared_t *lock = local_lock->shared_data; uint32_t tail = lock->tail; if (lock->flags[tail % lock->size].flag==1) { if (CAS_U32(&(lock->tail), tail, tail+1)==tail) { local_lock->my_index = tail % lock->size; return 0; } } return 1; }
qnode* hclh_release(qnode *my_qnode, qnode * my_pred, uint8_t th_cluster) { my_qnode->fields.successor_must_wait = 0; qnode* pr = my_pred; qnode new_node; new_node.data=0; new_node.fields.cluster_id=th_cluster; new_node.fields.successor_must_wait = 1; new_node.fields.tail_when_spliced=0; uint32_t old_data = pr->data; while (CAS_U32(&pr->data,old_data,new_node.data)!=old_data) { old_data=pr->data; PAUSE; } my_qnode=pr; return my_qnode; }
qnode* hclh_release(qnode *my_qnode, qnode * my_pred) { my_qnode->fields.successor_must_wait = 0; qnode* pr = my_pred; qnode new_node; new_node.data=0; new_node.fields.cluster_id=hclh_node_mine; new_node.fields.successor_must_wait = 1; new_node.fields.tail_when_spliced=0; #if defined(OPTERON_OPTIMIZE) PREFETCHW(pr); #endif /* OPTERON_OPTIMIZE */ uint32_t old_data = pr->data; while (CAS_U32(&pr->data,old_data,new_node.data)!=old_data) { old_data=pr->data; PAUSE; #if defined(OPTERON_OPTIMIZE) PREFETCHW(pr); #endif /* OPTERON_OPTIMIZE */ } my_qnode=pr; return my_qnode; }