| 247 | } |
| 248 | |
| 249 | bool GraphTask::SyncRun(void) |
| 250 | { |
| 251 | if(status_ != EXEC_STATUS_INITED && status_ != EXEC_STATUS_READY) |
| 252 | |
| 253 | { |
| 254 | XLOG_ERROR() << "bad status: " << dev_engine_->GetStatusStr(status_) << "\n"; |
| 255 | return false; |
| 256 | } |
| 257 | |
| 258 | status_ = EXEC_STATUS_RUN; |
| 259 | output_wait_count_ = output_task_number_ * 2; // never signal graph task done |
| 260 | active_sub_task_count_ = 0; |
| 261 | |
| 262 | std::set<SubgraphTask*> working_set; |
| 263 | |
| 264 | for(unsigned int i = 0; i < sub_task_list_.size(); i++) |
| 265 | working_set.insert(sub_task_list_[i]); |
| 266 | |
| 267 | // first try: sequentially execution |
| 268 | for(unsigned int j = 0; j < sub_task_list_.size(); j++) |
| 269 | { |
| 270 | SubgraphTask* sub_task = sub_task_list_[j]; |
| 271 | |
| 272 | if(!sub_task->input_wait_count_) |
| 273 | { |
| 274 | bool ret = SyncRunSubgraphTask(sub_task); |
| 275 | if(ret) |
| 276 | working_set.erase(sub_task); |
| 277 | else |
| 278 | { |
| 279 | status_ = EXEC_STATUS_BAD; |
| 280 | return false; |
| 281 | } |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | // second round: repeatly try the tasks in working_set |
| 286 | |
| 287 | while(!working_set.empty()) |
| 288 | { |
| 289 | for(auto ir = working_set.begin(); ir != working_set.end();) |
| 290 | { |
| 291 | SubgraphTask* sub_task = *ir; |
| 292 | |
| 293 | if(sub_task->input_wait_count_) |
| 294 | ir++; |
| 295 | else |
| 296 | { |
| 297 | if(SyncRunSubgraphTask(sub_task)) |
| 298 | { |
| 299 | ir = working_set.erase(ir); |
| 300 | } |
| 301 | else |
| 302 | { |
| 303 | status_ = EXEC_STATUS_BAD; |
| 304 | return false; |
| 305 | } |
| 306 | } |
no test coverage detected