| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef THIRD_PARTY_CRUBIT_SUPPORT_RS_STD_CPP_WAKER_H_ | |
| #define THIRD_PARTY_CRUBIT_SUPPORT_RS_STD_CPP_WAKER_H_ | |
| namespace rs_std { | |
| class CppWaker; | |
| namespace internal { | |
| // These extern "C" functions defined in `cpp_waker.cc` are used by | |
| // `dyn_future.rs` to implement the Rust `Waker` API. | |
| // | |
| // These are internal implementation details and should not be used except | |
| // from `cpp_waker.cc`. | |
| extern "C" CppWaker* rs_std_cpp_waker_clone(CppWaker* in); | |
| extern "C" void rs_std_cpp_waker_wake_and_destroy(CppWaker* in); | |
| extern "C" void rs_std_cpp_waker_wake_by_ref(CppWaker* in); | |
| extern "C" void rs_std_cpp_waker_drop(CppWaker* in); | |
| } // namespace internal | |
| // A base class for C++ implementations of Rust `Waker` objects. | |
| // | |
| // All operations must be thread-safe. | |
| class CppWaker { | |
| protected: | |
| // CppWaker instances cannot be destroyed via base class pointer. | |
| // Subclasses should manage their own destruction using `Destroy`. | |
| ~CppWaker() = default; | |
| private: | |
| // Called when `Waker::wake_by_ref` is called on the Rust `Waker` object. | |
| // | |
| // The `CppWaker` must remain valid for further calls after this function | |
| // returns. | |
| virtual void WakeByRef() = 0; | |
| // Called when `Waker::wake` is called on the Rust `Waker` object. | |
| // | |
| // The Rust version of this function consumes `self` by-value, so no further | |
| // calls to the `CppWaker` object are expected. If `Clone` is implemented via | |
| // a reference count, this function should decrement the reference count. | |
| virtual void WakeAndDestroy() = 0; | |
| // Called when the Rust `Waker` is cloned. | |
| // | |
| // Returns a `CppWaker` pointer that wakes the same task as `this`. | |
| // This may be implemented by incrementing a reference count and returning | |
| // `this`. | |
| virtual CppWaker* Clone() = 0; | |
| // Called when the Rust `Waker` is destroyed. | |
| // | |
| // Destroys this `CppWaker` object. If `Clone` is implemented via a reference | |
| // count, this function should decrement the reference count. | |
| virtual void Destroy() = 0; | |
| friend CppWaker* internal::rs_std_cpp_waker_clone(CppWaker* in); | |
| friend void internal::rs_std_cpp_waker_wake_and_destroy(CppWaker* in); | |
| friend void internal::rs_std_cpp_waker_wake_by_ref(CppWaker* in); | |
| friend void internal::rs_std_cpp_waker_drop(CppWaker* in); | |
| }; | |
| } // namespace rs_std | |
| #endif // THIRD_PARTY_CRUBIT_SUPPORT_RS_STD_CPP_WAKER_H_ |