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