| 423 | } |
| 424 | |
| 425 | bool AddTask(std::unique_ptr<Task> task) override { |
| 426 | state_->task_count++; |
| 427 | struct WrapperTask : public Task { |
| 428 | WrapperTask(std::unique_ptr<Task> target, std::shared_ptr<State> state) |
| 429 | : target(std::move(target)), state(std::move(state)) {} |
| 430 | Result<Future<>> operator()() override { |
| 431 | ARROW_ASSIGN_OR_RAISE(Future<> inner_fut, (*target)()); |
| 432 | return inner_fut.Then([state = std::move(state)]() { |
| 433 | if (--state->task_count == 0) { |
| 434 | return std::move(state->finish_cb)(); |
| 435 | } |
| 436 | return Status::OK(); |
| 437 | }); |
| 438 | } |
| 439 | int cost() const override { return target->cost(); } |
| 440 | std::string_view name() const override { return target->name(); } |
| 441 | std::unique_ptr<Task> target; |
| 442 | std::shared_ptr<State> state; |
| 443 | }; |
| 444 | return target_->AddTask(std::make_unique<WrapperTask>(std::move(task), state_)); |
| 445 | } |
| 446 | |
| 447 | const util::tracing::Span& span() const override { return target_->span(); } |
| 448 |
no outgoing calls