Exemple #1
0
/*******************************************************************//**
Initialize lock queue iterator so that it starts to iterate from
"lock". bit_no specifies the record number within the heap where the
record is stored. It can be undefined (ULINT_UNDEFINED) in two cases:
1. If the lock is a table lock, thus we have a table lock queue;
2. If the lock is a record lock and it is a wait lock. In this case
   bit_no is calculated in this function by using
   lock_rec_find_set_bit(). There is exactly one bit set in the bitmap
   of a wait lock. */
UNIV_INTERN
void
lock_queue_iterator_reset(
    /*======================*/
    lock_queue_iterator_t*	iter,	/*!< out: iterator */
    const lock_t*		lock,	/*!< in: lock to start from */
    ulint			bit_no)	/*!< in: record number in the
					heap */
{
    iter->current_lock = lock;

    if (bit_no != ULINT_UNDEFINED) {

        iter->bit_no = bit_no;
    } else {

        switch (lock_get_type_low(lock)) {
        case LOCK_TABLE:
            iter->bit_no = ULINT_UNDEFINED;
            break;
        case LOCK_REC:
            iter->bit_no = lock_rec_find_set_bit(lock);
            ut_a(iter->bit_no != ULINT_UNDEFINED);
            break;
        default:
            ut_error;
        }
    }
}
Exemple #2
0
/*******************************************************************//**
For a record lock that is in waiting state retrieves the only bit that
is set, for a table lock returns ULINT_UNDEFINED.
@return	record number within the heap */
static
ulint
wait_lock_get_heap_no(
/*==================*/
	const lock_t*	lock)	/*!< in: lock */
{
	ulint	ret;

	switch (lock_get_type(lock)) {
	case LOCK_REC:
		ret = lock_rec_find_set_bit(lock);
		ut_a(ret != ULINT_UNDEFINED);
		break;
	case LOCK_TABLE:
		ret = ULINT_UNDEFINED;
		break;
	default:
		ut_error;
	}

	return(ret);
}