| 519 | } |
| 520 | |
| 521 | bool jrd_rel::GCExclusive::acquire(int wait) |
| 522 | { |
| 523 | // if validation is already running - go out |
| 524 | if (m_relation->rel_flags & REL_gc_disabled) |
| 525 | return false; |
| 526 | |
| 527 | ThreadStatusGuard temp_status(m_tdbb); |
| 528 | |
| 529 | m_relation->rel_flags |= REL_gc_disabled; |
| 530 | |
| 531 | int sleeps = -wait * 10; |
| 532 | while (m_relation->rel_sweep_count) |
| 533 | { |
| 534 | EngineCheckout cout(m_tdbb, FB_FUNCTION); |
| 535 | Thread::sleep(100); |
| 536 | |
| 537 | if (wait < 0 && --sleeps == 0) |
| 538 | break; |
| 539 | } |
| 540 | |
| 541 | if (m_relation->rel_sweep_count) |
| 542 | { |
| 543 | m_relation->rel_flags &= ~REL_gc_disabled; |
| 544 | return false; |
| 545 | } |
| 546 | |
| 547 | if (!(m_relation->rel_flags & REL_gc_lockneed)) |
| 548 | { |
| 549 | m_relation->rel_flags |= REL_gc_lockneed; |
| 550 | LCK_release(m_tdbb, m_relation->rel_gc_lock); |
| 551 | } |
| 552 | |
| 553 | // we need no AST here |
| 554 | if (!m_lock) |
| 555 | m_lock = jrd_rel::createLock(m_tdbb, NULL, m_relation, LCK_rel_gc, true); |
| 556 | |
| 557 | const bool ret = LCK_lock(m_tdbb, m_lock, LCK_PW, wait); |
| 558 | if (!ret) |
| 559 | m_relation->rel_flags &= ~REL_gc_disabled; |
| 560 | |
| 561 | return ret; |
| 562 | } |
| 563 | |
| 564 | void jrd_rel::GCExclusive::release() |
| 565 | { |
no test coverage detected