1a34a8711Sopenharmony_ci// Copyright (C) 2024 Huawei Device Co., Ltd.
2a34a8711Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3a34a8711Sopenharmony_ci// you may not use this file except in compliance with the License.
4a34a8711Sopenharmony_ci// You may obtain a copy of the License at
5a34a8711Sopenharmony_ci//
6a34a8711Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7a34a8711Sopenharmony_ci//
8a34a8711Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9a34a8711Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10a34a8711Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11a34a8711Sopenharmony_ci// See the License for the specific language governing permissions and
12a34a8711Sopenharmony_ci// limitations under the License.
13a34a8711Sopenharmony_ci
14a34a8711Sopenharmony_ci//! ipc async impl
15a34a8711Sopenharmony_ci
16a34a8711Sopenharmony_cimod ipc_ylong;
17a34a8711Sopenharmony_ci
18a34a8711Sopenharmony_ciuse std::future::Future;
19a34a8711Sopenharmony_ciuse std::pin::Pin;
20a34a8711Sopenharmony_ci
21a34a8711Sopenharmony_cipub use ipc_ylong::{Runtime, Ylong};
22a34a8711Sopenharmony_ciuse ylong_runtime::task::JoinHandle;
23a34a8711Sopenharmony_ci
24a34a8711Sopenharmony_ciuse crate::errors::IpcResult;
25a34a8711Sopenharmony_ci
26a34a8711Sopenharmony_ci/// A type alias for a pinned, boxed future that lets you write shorter code
27a34a8711Sopenharmony_ci/// without littering it with Pin and Send bounds.
28a34a8711Sopenharmony_cipub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
29a34a8711Sopenharmony_ci
30a34a8711Sopenharmony_ci/// A thread pool for running ipc transactions.
31a34a8711Sopenharmony_cipub trait IpcAsyncPool {
32a34a8711Sopenharmony_ci    /// This function should conceptually behave like this:
33a34a8711Sopenharmony_ci    ///
34a34a8711Sopenharmony_ci    /// ```text
35a34a8711Sopenharmony_ci    /// let result = spawn(spawn, after_handle).await;
36a34a8711Sopenharmony_ci    /// ```
37a34a8711Sopenharmony_ci    fn spawn<'a, F1, F2, Fut, A, B>(
38a34a8711Sopenharmony_ci        spawn_this: F1,
39a34a8711Sopenharmony_ci        after_handle: F2,
40a34a8711Sopenharmony_ci    ) -> BoxFuture<'a, IpcResult<B>>
41a34a8711Sopenharmony_ci    where
42a34a8711Sopenharmony_ci        F1: FnOnce() -> A,
43a34a8711Sopenharmony_ci        F2: FnOnce(A) -> Fut,
44a34a8711Sopenharmony_ci        Fut: Future<Output = IpcResult<B>>,
45a34a8711Sopenharmony_ci        F1: Send + 'static,
46a34a8711Sopenharmony_ci        F2: Send + 'a,
47a34a8711Sopenharmony_ci        Fut: Send + 'a,
48a34a8711Sopenharmony_ci        A: Send + 'static,
49a34a8711Sopenharmony_ci        B: Send + 'a;
50a34a8711Sopenharmony_ci}
51a34a8711Sopenharmony_ci
52a34a8711Sopenharmony_ci/// A runtime for executing an async ipc server.
53a34a8711Sopenharmony_cipub trait IpcAsyncRuntime {
54a34a8711Sopenharmony_ci    /// Using the default task setting, spawns a task onto the global runtime.
55a34a8711Sopenharmony_ci    fn spawn<T, R>(task: T) -> JoinHandle<R>
56a34a8711Sopenharmony_ci    where
57a34a8711Sopenharmony_ci        T: Future<Output = R>,
58a34a8711Sopenharmony_ci        T: Send + 'static,
59a34a8711Sopenharmony_ci        R: Send + 'static;
60a34a8711Sopenharmony_ci
61a34a8711Sopenharmony_ci    /// Using the default task setting, spawns a blocking task.
62a34a8711Sopenharmony_ci    fn spawn_blocking<T, R>(task: T) -> JoinHandle<R>
63a34a8711Sopenharmony_ci    where
64a34a8711Sopenharmony_ci        T: FnOnce() -> R,
65a34a8711Sopenharmony_ci        T: Send + 'static,
66a34a8711Sopenharmony_ci        R: Send + 'static;
67a34a8711Sopenharmony_ci
68a34a8711Sopenharmony_ci    /// Block on the provided future, running it to completion and returning its
69a34a8711Sopenharmony_ci    /// output.
70a34a8711Sopenharmony_ci    fn block_on<F: Future>(future: F) -> F::Output;
71a34a8711Sopenharmony_ci}
72