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