void TaskManager::finish_task(Task* task) { u32 dependent_tasks = task->m_dependent_tasks.fetch_sub(1) - 1; if (dependent_tasks == 0 && task->m_parent) { finish_task(task->m_parent); } }
void QuickVerifyTask::VerifyBlock( const DM::PORT * port, qlonglong offset , qlonglong sector_count ) { assert( port != nullptr ); auto disk = disk_master_->getDiskDevice( port ); assert ( disk != nullptr ); assert( disk->getSize() <= (qlonglong)( offset + sector_count ) ); currentSector_ = offset_; DWORD block_size = MaxSectorsCount; qlonglong prev_sector = currentSector_; while( currentSector_ < sector_count ) { if ( task_break_ ) break; if( (qlonglong) (currentSector_ + block_size ) > sector_count ) { block_size = (DWORD) (sector_count - currentSector_); } qDebug() << "QuickVefifyTask is starting...(" << currentSector_ << ")"; currentSector_ ; bExecuting_ = true; if ( ExecuteTask( port->number , currentSector_ , block_size ) ) { /*sectors += block_size;*/ if ( block_size < MaxSectorsCount ) block_size *= 2; } else { block_size = MinSectorsCount; //sectors = currentSector_; } bExecuting_ = false; } if ( task_break_ ) emit break_task( currentSector_ ); else emit finish_task( this->getLastSector() ); }
void TaskManager::execute_task(Task* task) { (task->m_task_function)(task, task->m_data); finish_task(task); }