/
githubmirror
/
servo
Обзор
Документация
Войти
/
githubmirror
/
servo
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
components/devtools/actors/performance.rs
138 строк
4 KB
eri
devtools: Avoid panics when borrowing in `ActorRegistry` (#45248)
04 июн 2026, 13:57
Не верифицирован
04 июн 2026, 13:57
84fa008
Код
Авторство
О чём код?
/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::sync::Arc; use malloc_size_of_derive::MallocSizeOf; use serde::Serialize; use serde_json::{Map, Value}; use crate::StreamId; use crate::actor::{Actor, ActorError, ActorRegistry, new_actor_name}; use crate::protocol::{ActorDescription, ClientRequest, Method}; #[derive(MallocSizeOf)] pub(crate) struct PerformanceActor { name: String, } #[derive(Serialize)] #[serde(rename_all = "camelCase")] struct PerformanceFeatures { with_markers: bool, with_memory: bool, with_ticks: bool, with_allocations: bool, #[serde(rename = "withJITOptimizations")] with_jitoptimizations: bool, } #[derive(Serialize)] struct PerformanceTraits { features: PerformanceFeatures, } #[derive(Serialize)] struct ConnectReply { from: String, traits: PerformanceTraits, } #[derive(Serialize)] struct CanCurrentlyRecordReply { from: String, value: SuccessMsg, } #[derive(Serialize)] struct SuccessMsg { success: bool, errors: Vec<Error>, } #[derive(Serialize)] enum Error {} impl Actor for PerformanceActor { fn name(&self) -> &str { &self.name } fn handle_message( &self, request: ClientRequest, _registry: &ActorRegistry, msg_type: &str, _msg: &Map<String, Value>, _id: StreamId, ) -> Result<(), ActorError> { match msg_type { "connect" => { let msg = ConnectReply { from: self.name().into(), traits: PerformanceTraits { features: PerformanceFeatures { with_markers: true, with_memory: true, with_ticks: true, with_allocations: true, with_jitoptimizations: true, }, }, }; request.reply_final(&msg)? }, "canCurrentlyRecord" => { let msg = CanCurrentlyRecordReply { from: self.name().into(), value: SuccessMsg { success: true, errors: vec![], }, }; request.reply_final(&msg)? }, _ => return Err(ActorError::UnrecognizedPacketType), }; Ok(()) } } impl PerformanceActor { pub fn register(registry: &ActorRegistry) -> Arc<Self> { let name = new_actor_name::<Self>(); let actor = PerformanceActor { name }; registry.register::<Self>(actor) } pub fn description() -> ActorDescription { ActorDescription { category: "actor", type_name: "performance", methods: vec![Method { name: "canCurrentlyRecord", request: Value::Object( vec![( "type".to_owned(), Value::String("canCurrentlyRecord".to_owned()), )] .into_iter() .collect(), ), response: Value::Object( vec![( "value".to_owned(), Value::Object( vec![("_retval".to_owned(), Value::String("json".to_owned()))] .into_iter() .collect(), ), )] .into_iter() .collect(), ), }], } } }