/*******************************************************************//** 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; } } }
/*******************************************************************//** 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); }