1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 //! Implementation of task handle. 17 18 use fusion_utils_rust::{ FusionErrorCode, FusionResult }; 19 use ylong_runtime::task::JoinHandle; 20 21 /// Representation of task handle. 22 pub struct TaskHandle<R> { 23 join_handle: Option<JoinHandle<R>>, 24 } 25 26 impl<R> From<JoinHandle<R>> for TaskHandle<R> { from(value: JoinHandle<R>) -> Self27 fn from(value: JoinHandle<R>) -> Self 28 { 29 Self { 30 join_handle: Some(value), 31 } 32 } 33 } 34 35 impl<R> TaskHandle<R> { 36 /// Cancel this task. cancel(&mut self)37 pub fn cancel(&mut self) 38 { 39 if let Some(join_handle) = self.join_handle.take() { 40 join_handle.cancel(); 41 } 42 } 43 44 /// Get result of this task. result(&mut self) -> FusionResult<R>45 pub fn result(&mut self) -> FusionResult<R> 46 { 47 if let Some(join_handle) = self.join_handle.take() { 48 if let Ok(ret) = ylong_runtime::block_on(join_handle) { 49 Ok(ret) 50 } else { 51 Err(FusionErrorCode::Fail) 52 } 53 } else { 54 Err(FusionErrorCode::Fail) 55 } 56 } 57 } 58