MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / getWorkItem

Method getWorkItem

src/jrd/vio.cpp:507–566  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

505}
506
507bool SweepTask::getWorkItem(WorkItem** pItem)
508{
509 MutexLockGuard guard(m_mutex, FB_FUNCTION);
510
511 Item* item = reinterpret_cast<Item*> (*pItem);
512
513 if (item == NULL)
514 {
515 for (Item** p = m_items.begin(); p < m_items.end(); p++)
516 if (!(*p)->m_inuse)
517 {
518 (*p)->m_inuse = true;
519 *pItem = item = *p;
520 break;
521 }
522 }
523 else if (updateRelInfo(item))
524 return true;
525
526 if (!item)
527 return false;
528
529 // assign part of task to item
530 if (m_nextRelID >= m_lastRelID)
531 {
532 // find not handled relation and help to handle it
533 RelInfo* relInfo = m_relInfo.begin();
534 for (; relInfo < m_relInfo.end(); relInfo++)
535 if (relInfo->workers > 0)
536 {
537 item->m_relInfo = relInfo;
538 relInfo->workers++;
539 if (updateRelInfo(item))
540 return true;
541 }
542
543 item->m_inuse = false;
544 return false;
545 }
546
547 // start to handle next relation
548 USHORT relID = m_nextRelID++;
549 RelInfo* relInfo = m_relInfo.begin();
550 for (; relInfo < m_relInfo.end(); relInfo++)
551 if (relInfo->workers == 0)
552 {
553 relInfo->workers++;
554 relInfo->rel_id = relID;
555 relInfo->countPP = 0;
556 item->m_relInfo = relInfo;
557 item->m_firstPP = item->m_lastPP = 0;
558 relInfo->nextPP = item->m_lastPP + 1;
559
560 return true;
561 }
562
563
564 item->m_inuse = false;

Callers 1

workMethod · 0.45

Calls 2

beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected