static void *qt_lf_list_find(marked_ptr_t *head, so_key_t hashed_key, qt_key_t key, marked_ptr_t **oprev, marked_ptr_t *ocur, marked_ptr_t *onext, qt_dict_key_equals_f op_equals) { so_key_t ckey; qt_key_t okey; void *cval; marked_ptr_t *prev = NULL; marked_ptr_t cur = UNINITIALIZED; marked_ptr_t next = UNINITIALIZED; // int foundInsertPos = 0; while (1) { prev = head; cur = *prev; while (1) { if (PTR_OF(cur) == NULL) { if (oprev) { *oprev = prev; } if (ocur) { *ocur = cur; } if (onext) { *onext = next; } return 0; } next = (marked_ptr_t)(PTR_OF(cur)->next); ckey = PTR_OF(cur)->hashed_key; cval = PTR_OF(cur)->value; okey = PTR_OF(cur)->key; if (*prev != CONSTRUCT(0, cur)) { break; // this means someone mucked with the list; start over } if (!MARK_OF(next)) { // if next pointer is not marked if (ckey >= hashed_key) { // if current key > hashed_key, the key isn't in the list; if current key == hashed_key, the key IS in the list // if (foundInsertPos == 0) { if (oprev) { *oprev = prev; } if (ocur) { *ocur = cur; } if (onext) { *onext = next; } // foundInsertPos = 1; // } if(ckey == hashed_key) { if((okey != NULL) && op_equals(okey, key)) { /* * if (oprev) { *oprev = prev; } * if (ocur) { *ocur = cur; } * if (onext) { *onext = next; } */ return cval; } // else, keep looking } else { return NULL; } } // but if current key < hashed_key, the we don't know yet, keep looking prev = (marked_ptr_t *)&(PTR_OF(cur)->next); } else { if (qthread_cas(prev, CONSTRUCT(0, cur), CONSTRUCT(0, next)) == CONSTRUCT(0, cur)) { qpool_free(hash_entry_pool, PTR_OF(cur)); } else { break; } } cur = next; } } }
static int op_oplevel(int level) { int precision; bwx_DEBUG(__FUNCTION__); /* set the precision */ if ((precision = op_getprecision(level)) == OP_ERROR) { op_pulldown(2); sprintf(bwb_ebuf, "exp_operation(): failed to set precision."); bwb_error(bwb_ebuf); return FALSE; } /* precision is set correctly */ else { switch (CURTASK exps[level].operation) { case OP_ADD: op_add(level, precision); break; case OP_SUBTRACT: op_subtract(level, precision); break; case OP_MULTIPLY: op_multiply(level, precision); break; case OP_DIVIDE: op_divide(level, precision); break; case OP_ASSIGN: op_assign(level, precision); break; case OP_EQUALS: op_equals(level, precision); break; case OP_LESSTHAN: op_lessthan(level, precision); break; case OP_GREATERTHAN: op_greaterthan(level, precision); break; case OP_LTEQ: op_lteq(level, precision); break; case OP_GTEQ: op_gteq(level, precision); break; case OP_NOTEQUAL: op_notequal(level, precision); break; case OP_MODULUS: op_modulus(level, precision); break; case OP_INTDIVISION: op_intdiv(level, precision); break; case OP_OR: op_or(level, precision); break; case OP_AND: op_and(level, precision); break; case OP_NOT: op_not(level, precision); break; case OP_XOR: op_xor(level, precision); break; case OP_IMPLIES: op_imp(level, precision); break; case OP_EQUIV: op_eqv(level, precision); break; case OP_EXPONENT: op_exponent(level, precision); break; case OP_NEGATION: /* JBV */ op_negation(level, precision); break; case OP_POSATION: op_posation(level, precision); break; default: sprintf(bwb_ebuf, "PROGRAMMING ERROR: operator <%d> not (yet) supported.", CURTASK exps[level].operation); op_pulldown(2); bwb_error(bwb_ebuf); return FALSE; break; } /* end of case statement for operators */ } /* end of else statement, precision set */ return TRUE; } /* end of function op_oplevel() */