| 648 | |
| 649 | |
| 650 | bool LCK_lock(thread_db* tdbb, Lock* lock, USHORT level, SSHORT wait) |
| 651 | { |
| 652 | /************************************** |
| 653 | * |
| 654 | * L C K _ l o c k |
| 655 | * |
| 656 | ************************************** |
| 657 | * |
| 658 | * Functional description |
| 659 | * Lock a block. There had better not have been a lock there. |
| 660 | * |
| 661 | **************************************/ |
| 662 | SET_TDBB(tdbb); |
| 663 | fb_assert(LCK_CHECK_LOCK(lock)); |
| 664 | |
| 665 | #ifdef DEBUG_LCK |
| 666 | LckSync sync(lock, "LCK_lock"); |
| 667 | #endif |
| 668 | |
| 669 | Database* dbb = lock->lck_dbb; |
| 670 | lock->setLockAttachment(tdbb->getAttachment()); |
| 671 | |
| 672 | WaitCancelGuard guard(tdbb, lock, wait); |
| 673 | FbLocalStatus statusVector; |
| 674 | |
| 675 | ENQUEUE(tdbb, &statusVector, lock, level, wait); |
| 676 | fb_assert(LCK_CHECK_LOCK(lock)); |
| 677 | |
| 678 | if (!lock->lck_id) |
| 679 | { |
| 680 | lock->setLockAttachment(NULL); |
| 681 | if (!wait) |
| 682 | { |
| 683 | statusVector.copyTo(tdbb->tdbb_status_vector); |
| 684 | return false; |
| 685 | } |
| 686 | |
| 687 | switch (statusVector[1]) |
| 688 | { |
| 689 | case isc_deadlock: |
| 690 | case isc_lock_conflict: |
| 691 | case isc_lock_timeout: |
| 692 | statusVector.copyTo(tdbb->tdbb_status_vector); |
| 693 | tdbb->checkCancelState(); |
| 694 | return false; |
| 695 | case isc_lockmanerr: |
| 696 | dbb->dbb_flags |= DBB_bugcheck; |
| 697 | break; |
| 698 | } |
| 699 | |
| 700 | statusVector.raise(); |
| 701 | } |
| 702 | |
| 703 | if (!lock->lck_compatible) |
| 704 | lock->lck_physical = lock->lck_logical = level; |
| 705 | |
| 706 | fb_assert(LCK_CHECK_LOCK(lock)); |
| 707 | return true; |
no test coverage detected