| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_LEDGER_BIN_SYNCHRONIZATION_COMPLETER_H_ |
| #define SRC_LEDGER_BIN_SYNCHRONIZATION_COMPLETER_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include <vector> |
| |
| #include "src/ledger/bin/public/status.h" |
| #include "src/ledger/lib/callback/scoped_task_runner.h" |
| #include "src/ledger/lib/coroutine/coroutine.h" |
| |
| namespace ledger { |
| |
| // TODO(opalle): Consider using DelayingFacade instead of Completer. |
| // A Completer allowing waiting until the target operation is completed. |
| class Completer { |
| public: |
| Completer(async_dispatcher_t* dispatcher); |
| Completer(const Completer&) = delete; |
| Completer& operator=(const Completer&) = delete; |
| ~Completer(); |
| |
| // Completes the operation with the given status and unblocks all pending |
| // |WaitUntilDone| calls. |Complete| can only be called once. |
| void Complete(Status status); |
| |
| // Executes the callback after |Complete| is called, and then returns its status. |
| // If the operation is already completed, |WaitUntilDone| returns |
| // immediately with the result status. |
| // If the operation is not yet completed, |callback| is |
| // executed asynchronously by posting it to the |dispatcher| provided in the constructor after |
| // |Complete| is called. |
| void WaitUntilDone(fit::function<void(Status)> callback); |
| |
| // Returns true, if the operation was completed. |
| bool IsCompleted(); |
| |
| private: |
| bool completed_ = false; |
| Status status_; |
| // Closures invoked upon completion to unblock the waiting coroutines. |
| std::vector<fit::function<void(Status)>> callbacks_; |
| |
| ScopedTaskRunner task_runner_; |
| }; |
| |
| Status SyncWaitUntilDone(coroutine::CoroutineHandler* handler, Completer* completer); |
| |
| } // namespace ledger |
| |
| #endif // SRC_LEDGER_BIN_SYNCHRONIZATION_COMPLETER_H_ |