| 40 | } |
| 41 | |
| 42 | int ParallelExecutor::execute_tasks(const TaskPtrList &tasks) { |
| 43 | int code = 0; |
| 44 | if (tasks.empty()) { |
| 45 | return code; |
| 46 | } |
| 47 | |
| 48 | auto iter = tasks.begin(); |
| 49 | // Keep the head task, schedule others to other coroutines |
| 50 | while (++iter != tasks.end()) { |
| 51 | code = scheduler_->schedule(*iter); |
| 52 | // Break loop, if schedule task failed,handle schedule error in |
| 53 | // wait_finish function |
| 54 | if (code != 0) { |
| 55 | LOG_ERROR("Can't schedule task to run. code[%d]", code); |
| 56 | break; |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | // Execute first task in queue, if all others have been scheduled |
| 61 | if (code == 0) { |
| 62 | execute_task(*tasks.begin()); |
| 63 | } |
| 64 | |
| 65 | // Ignore return code of first task, wait finished event for all tasks. |
| 66 | return wait_finish(tasks); |
| 67 | } |
| 68 | |
| 69 | int ParallelExecutor::wait_finish(const TaskPtrList &tasks) { |
| 70 | int error_code = 0; |