mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Remove EventLoopWaker
from Constellation (#30101)
* remove event_loop_waker that is always None * remove None event_loop_waker form InitialScriptState * fix formatting * remove None event_loop_waker from ScriptThread * remove None EventLoopWaker from Window * remove None and use of wake_after_send in webgl code
This commit is contained in:
parent
83a46f68db
commit
8255e8e318
7 changed files with 15 additions and 78 deletions
|
@ -115,7 +115,7 @@ use devtools_traits::{
|
||||||
ChromeToDevtoolsControlMsg, DevtoolsControlMsg, DevtoolsPageInfo, NavigationState,
|
ChromeToDevtoolsControlMsg, DevtoolsControlMsg, DevtoolsPageInfo, NavigationState,
|
||||||
ScriptToDevtoolsControlMsg,
|
ScriptToDevtoolsControlMsg,
|
||||||
};
|
};
|
||||||
use embedder_traits::{Cursor, EmbedderMsg, EmbedderProxy, EventLoopWaker};
|
use embedder_traits::{Cursor, EmbedderMsg, EmbedderProxy};
|
||||||
use embedder_traits::{MediaSessionEvent, MediaSessionPlaybackState};
|
use embedder_traits::{MediaSessionEvent, MediaSessionPlaybackState};
|
||||||
use euclid::{default::Size2D as UntypedSize2D, Size2D};
|
use euclid::{default::Size2D as UntypedSize2D, Size2D};
|
||||||
use gfx::font_cache_thread::FontCacheThread;
|
use gfx::font_cache_thread::FontCacheThread;
|
||||||
|
@ -504,9 +504,6 @@ pub struct Constellation<Message, LTF, STF, SWF> {
|
||||||
/// Application window's GL Context for Media player
|
/// Application window's GL Context for Media player
|
||||||
player_context: WindowGLContext,
|
player_context: WindowGLContext,
|
||||||
|
|
||||||
/// Mechanism to force the compositor to process events.
|
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
|
|
||||||
/// Pipeline ID of the active media session.
|
/// Pipeline ID of the active media session.
|
||||||
active_media_session: Option<PipelineId>,
|
active_media_session: Option<PipelineId>,
|
||||||
|
|
||||||
|
@ -563,9 +560,6 @@ pub struct InitialConstellationState {
|
||||||
/// Application window's GL Context for Media player
|
/// Application window's GL Context for Media player
|
||||||
pub player_context: WindowGLContext,
|
pub player_context: WindowGLContext,
|
||||||
|
|
||||||
/// Mechanism to force the compositor to process events.
|
|
||||||
pub event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
|
|
||||||
/// User agent string to report in network requests.
|
/// User agent string to report in network requests.
|
||||||
pub user_agent: Cow<'static, str>,
|
pub user_agent: Cow<'static, str>,
|
||||||
|
|
||||||
|
@ -827,7 +821,6 @@ where
|
||||||
enable_canvas_antialiasing,
|
enable_canvas_antialiasing,
|
||||||
glplayer_threads: state.glplayer_threads,
|
glplayer_threads: state.glplayer_threads,
|
||||||
player_context: state.player_context,
|
player_context: state.player_context,
|
||||||
event_loop_waker: state.event_loop_waker,
|
|
||||||
active_media_session: None,
|
active_media_session: None,
|
||||||
user_agent: state.user_agent,
|
user_agent: state.user_agent,
|
||||||
};
|
};
|
||||||
|
@ -1078,7 +1071,7 @@ where
|
||||||
.map(|threads| threads.pipeline()),
|
.map(|threads| threads.pipeline()),
|
||||||
webxr_registry: self.webxr_registry.clone(),
|
webxr_registry: self.webxr_registry.clone(),
|
||||||
player_context: self.player_context.clone(),
|
player_context: self.player_context.clone(),
|
||||||
event_loop_waker: self.event_loop_waker.as_ref().map(|w| (*w).clone_box()),
|
event_loop_waker: None,
|
||||||
user_agent: self.user_agent.clone(),
|
user_agent: self.user_agent.clone(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -327,11 +327,7 @@ impl Pipeline {
|
||||||
let register = state
|
let register = state
|
||||||
.background_monitor_register
|
.background_monitor_register
|
||||||
.expect("Couldn't start content, no background monitor has been initiated");
|
.expect("Couldn't start content, no background monitor has been initiated");
|
||||||
unprivileged_pipeline_content.start_all::<Message, LTF, STF>(
|
unprivileged_pipeline_content.start_all::<Message, LTF, STF>(false, register);
|
||||||
false,
|
|
||||||
register,
|
|
||||||
state.event_loop_waker,
|
|
||||||
);
|
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -527,7 +523,6 @@ impl UnprivilegedPipelineContent {
|
||||||
self,
|
self,
|
||||||
wait_for_completion: bool,
|
wait_for_completion: bool,
|
||||||
background_hang_monitor_register: Box<dyn BackgroundHangMonitorRegister>,
|
background_hang_monitor_register: Box<dyn BackgroundHangMonitorRegister>,
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
) where
|
) where
|
||||||
LTF: LayoutThreadFactory<Message = Message>,
|
LTF: LayoutThreadFactory<Message = Message>,
|
||||||
STF: ScriptThreadFactory<Message = Message>,
|
STF: ScriptThreadFactory<Message = Message>,
|
||||||
|
@ -574,7 +569,6 @@ impl UnprivilegedPipelineContent {
|
||||||
webrender_api_sender: self.webrender_api_sender.clone(),
|
webrender_api_sender: self.webrender_api_sender.clone(),
|
||||||
layout_is_busy: layout_thread_busy_flag.clone(),
|
layout_is_busy: layout_thread_busy_flag.clone(),
|
||||||
player_context: self.player_context.clone(),
|
player_context: self.player_context.clone(),
|
||||||
event_loop_waker,
|
|
||||||
inherited_secure_context: self.load_data.inherited_secure_context.clone(),
|
inherited_secure_context: self.load_data.inherited_secure_context.clone(),
|
||||||
},
|
},
|
||||||
self.load_data.clone(),
|
self.load_data.clone(),
|
||||||
|
|
|
@ -63,7 +63,6 @@ use canvas_traits::webgl::{
|
||||||
YAxisTreatment,
|
YAxisTreatment,
|
||||||
};
|
};
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use embedder_traits::EventLoopWaker;
|
|
||||||
use euclid::default::{Point2D, Rect, Size2D};
|
use euclid::default::{Point2D, Rect, Size2D};
|
||||||
use ipc_channel::ipc::{self, IpcSharedMemory};
|
use ipc_channel::ipc::{self, IpcSharedMemory};
|
||||||
use js::jsapi::{JSContext, JSObject, Type};
|
use js::jsapi::{JSContext, JSObject, Type};
|
||||||
|
@ -236,10 +235,7 @@ impl WebGLRenderingContext {
|
||||||
let max_vertex_attribs = ctx_data.limits.max_vertex_attribs as usize;
|
let max_vertex_attribs = ctx_data.limits.max_vertex_attribs as usize;
|
||||||
Self {
|
Self {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
webgl_sender: WebGLMessageSender::new(
|
webgl_sender: WebGLMessageSender::new(ctx_data.sender),
|
||||||
ctx_data.sender,
|
|
||||||
window.get_event_loop_waker(),
|
|
||||||
),
|
|
||||||
webrender_image: ctx_data.image_key,
|
webrender_image: ctx_data.image_key,
|
||||||
webgl_version,
|
webgl_version,
|
||||||
glsl_version: ctx_data.glsl_version,
|
glsl_version: ctx_data.glsl_version,
|
||||||
|
@ -4895,21 +4891,15 @@ pub enum TexSource {
|
||||||
pub struct WebGLCommandSender {
|
pub struct WebGLCommandSender {
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
sender: WebGLChan,
|
sender: WebGLChan,
|
||||||
#[no_trace]
|
|
||||||
waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebGLCommandSender {
|
impl WebGLCommandSender {
|
||||||
pub fn new(sender: WebGLChan, waker: Option<Box<dyn EventLoopWaker>>) -> WebGLCommandSender {
|
pub fn new(sender: WebGLChan) -> WebGLCommandSender {
|
||||||
WebGLCommandSender { sender, waker }
|
WebGLCommandSender { sender }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send(&self, msg: WebGLMsg) -> WebGLSendResult {
|
pub fn send(&self, msg: WebGLMsg) -> WebGLSendResult {
|
||||||
let result = self.sender.send(msg);
|
self.sender.send(msg)
|
||||||
if let Some(ref waker) = self.waker {
|
|
||||||
waker.wake();
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4917,34 +4907,19 @@ impl WebGLCommandSender {
|
||||||
pub(crate) struct WebGLMessageSender {
|
pub(crate) struct WebGLMessageSender {
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
sender: WebGLMsgSender,
|
sender: WebGLMsgSender,
|
||||||
#[ignore_malloc_size_of = "traits are cumbersome"]
|
|
||||||
#[no_trace]
|
|
||||||
waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Clone for WebGLMessageSender {
|
impl Clone for WebGLMessageSender {
|
||||||
fn clone(&self) -> WebGLMessageSender {
|
fn clone(&self) -> WebGLMessageSender {
|
||||||
WebGLMessageSender {
|
WebGLMessageSender {
|
||||||
sender: self.sender.clone(),
|
sender: self.sender.clone(),
|
||||||
waker: self.waker.as_ref().map(|w| (*w).clone_box()),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebGLMessageSender {
|
impl WebGLMessageSender {
|
||||||
fn wake_after_send<F: FnOnce() -> WebGLSendResult>(&self, f: F) -> WebGLSendResult {
|
pub fn new(sender: WebGLMsgSender) -> WebGLMessageSender {
|
||||||
let result = f();
|
WebGLMessageSender { sender }
|
||||||
if let Some(ref waker) = self.waker {
|
|
||||||
waker.wake();
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new(
|
|
||||||
sender: WebGLMsgSender,
|
|
||||||
waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
) -> WebGLMessageSender {
|
|
||||||
WebGLMessageSender { sender, waker }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn context_id(&self) -> WebGLContextId {
|
pub fn context_id(&self) -> WebGLContextId {
|
||||||
|
@ -4952,7 +4927,7 @@ impl WebGLMessageSender {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send(&self, msg: WebGLCommand, backtrace: WebGLCommandBacktrace) -> WebGLSendResult {
|
pub fn send(&self, msg: WebGLCommand, backtrace: WebGLCommandBacktrace) -> WebGLSendResult {
|
||||||
self.wake_after_send(|| self.sender.send(msg, backtrace))
|
self.sender.send(msg, backtrace)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_resize(
|
pub fn send_resize(
|
||||||
|
@ -4960,11 +4935,11 @@ impl WebGLMessageSender {
|
||||||
size: Size2D<u32>,
|
size: Size2D<u32>,
|
||||||
sender: WebGLSender<Result<(), String>>,
|
sender: WebGLSender<Result<(), String>>,
|
||||||
) -> WebGLSendResult {
|
) -> WebGLSendResult {
|
||||||
self.wake_after_send(|| self.sender.send_resize(size, sender))
|
self.sender.send_resize(size, sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_remove(&self) -> WebGLSendResult {
|
pub fn send_remove(&self) -> WebGLSendResult {
|
||||||
self.wake_after_send(|| self.sender.send_remove())
|
self.sender.send_remove()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -371,11 +371,6 @@ pub struct Window {
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
player_context: WindowGLContext,
|
player_context: WindowGLContext,
|
||||||
|
|
||||||
/// A mechanism to force the compositor to process events.
|
|
||||||
#[ignore_malloc_size_of = "traits are cumbersome"]
|
|
||||||
#[no_trace]
|
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
|
|
||||||
visible: Cell<bool>,
|
visible: Cell<bool>,
|
||||||
|
|
||||||
/// A shared marker for the validity of any cached layout values. A value of true
|
/// A shared marker for the validity of any cached layout values. A value of true
|
||||||
|
@ -514,7 +509,7 @@ impl Window {
|
||||||
pub(crate) fn webgl_chan(&self) -> Option<WebGLCommandSender> {
|
pub(crate) fn webgl_chan(&self) -> Option<WebGLCommandSender> {
|
||||||
self.webgl_chan
|
self.webgl_chan
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|chan| WebGLCommandSender::new(chan.clone(), self.get_event_loop_waker()))
|
.map(|chan| WebGLCommandSender::new(chan.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn webxr_registry(&self) -> webxr_api::Registry {
|
pub fn webxr_registry(&self) -> webxr_api::Registry {
|
||||||
|
@ -570,10 +565,6 @@ impl Window {
|
||||||
self.player_context.clone()
|
self.player_context.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_event_loop_waker(&self) -> Option<Box<dyn EventLoopWaker>> {
|
|
||||||
self.event_loop_waker.as_ref().map(|w| (*w).clone_box())
|
|
||||||
}
|
|
||||||
|
|
||||||
// see note at https://dom.spec.whatwg.org/#concept-event-dispatch step 2
|
// see note at https://dom.spec.whatwg.org/#concept-event-dispatch step 2
|
||||||
pub fn dispatch_event_with_target_override(&self, event: &Event) -> EventStatus {
|
pub fn dispatch_event_with_target_override(&self, event: &Event) -> EventStatus {
|
||||||
if self.has_document() {
|
if self.has_document() {
|
||||||
|
@ -2587,7 +2578,6 @@ impl Window {
|
||||||
replace_surrogates: bool,
|
replace_surrogates: bool,
|
||||||
user_agent: Cow<'static, str>,
|
user_agent: Cow<'static, str>,
|
||||||
player_context: WindowGLContext,
|
player_context: WindowGLContext,
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
gpu_id_hub: Arc<ParkMutex<Identities>>,
|
gpu_id_hub: Arc<ParkMutex<Identities>>,
|
||||||
inherited_secure_context: Option<bool>,
|
inherited_secure_context: Option<bool>,
|
||||||
) -> DomRoot<Self> {
|
) -> DomRoot<Self> {
|
||||||
|
@ -2673,7 +2663,6 @@ impl Window {
|
||||||
userscripts_path,
|
userscripts_path,
|
||||||
replace_surrogates,
|
replace_surrogates,
|
||||||
player_context,
|
player_context,
|
||||||
event_loop_waker,
|
|
||||||
visible: Cell::new(true),
|
visible: Cell::new(true),
|
||||||
layout_marker: DomRefCell::new(Rc::new(Cell::new(true))),
|
layout_marker: DomRefCell::new(Rc::new(Cell::new(true))),
|
||||||
current_event: DomRefCell::new(None),
|
current_event: DomRefCell::new(None),
|
||||||
|
|
|
@ -715,10 +715,6 @@ pub struct ScriptThread {
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
player_context: WindowGLContext,
|
player_context: WindowGLContext,
|
||||||
|
|
||||||
/// A mechanism to force the compositor's event loop to process events.
|
|
||||||
#[no_trace]
|
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
|
|
||||||
/// A set of all nodes ever created in this script thread
|
/// A set of all nodes ever created in this script thread
|
||||||
node_ids: DomRefCell<HashSet<String>>,
|
node_ids: DomRefCell<HashSet<String>>,
|
||||||
|
|
||||||
|
@ -1416,7 +1412,6 @@ impl ScriptThread {
|
||||||
replace_surrogates: opts.debug.replace_surrogates,
|
replace_surrogates: opts.debug.replace_surrogates,
|
||||||
user_agent,
|
user_agent,
|
||||||
player_context: state.player_context,
|
player_context: state.player_context,
|
||||||
event_loop_waker: state.event_loop_waker,
|
|
||||||
|
|
||||||
node_ids: Default::default(),
|
node_ids: Default::default(),
|
||||||
is_user_interacting: Cell::new(false),
|
is_user_interacting: Cell::new(false),
|
||||||
|
@ -3295,6 +3290,7 @@ impl ScriptThread {
|
||||||
self.timer_task_source(incomplete.pipeline_id),
|
self.timer_task_source(incomplete.pipeline_id),
|
||||||
self.websocket_task_source(incomplete.pipeline_id),
|
self.websocket_task_source(incomplete.pipeline_id),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create the window and document objects.
|
// Create the window and document objects.
|
||||||
let window = Window::new(
|
let window = Window::new(
|
||||||
self.js_runtime.clone(),
|
self.js_runtime.clone(),
|
||||||
|
@ -3333,7 +3329,6 @@ impl ScriptThread {
|
||||||
self.replace_surrogates,
|
self.replace_surrogates,
|
||||||
self.user_agent.clone(),
|
self.user_agent.clone(),
|
||||||
self.player_context.clone(),
|
self.player_context.clone(),
|
||||||
self.event_loop_waker.as_ref().map(|w| (*w).clone_box()),
|
|
||||||
self.gpu_id_hub.clone(),
|
self.gpu_id_hub.clone(),
|
||||||
incomplete.inherited_secure_context,
|
incomplete.inherited_secure_context,
|
||||||
);
|
);
|
||||||
|
|
|
@ -38,7 +38,7 @@ use canvas_traits::webgl::WebGLPipeline;
|
||||||
use compositor::ScrollTreeNodeId;
|
use compositor::ScrollTreeNodeId;
|
||||||
use crossbeam_channel::{Receiver, RecvTimeoutError, Sender};
|
use crossbeam_channel::{Receiver, RecvTimeoutError, Sender};
|
||||||
use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId};
|
use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId};
|
||||||
use embedder_traits::{Cursor, EventLoopWaker};
|
use embedder_traits::Cursor;
|
||||||
use euclid::{default::Point2D, Length, Rect, Scale, Size2D, UnknownUnit, Vector2D};
|
use euclid::{default::Point2D, Length, Rect, Scale, Size2D, UnknownUnit, Vector2D};
|
||||||
use gfx_traits::Epoch;
|
use gfx_traits::Epoch;
|
||||||
use http::HeaderMap;
|
use http::HeaderMap;
|
||||||
|
@ -687,8 +687,6 @@ pub struct InitialScriptState {
|
||||||
pub layout_is_busy: Arc<AtomicBool>,
|
pub layout_is_busy: Arc<AtomicBool>,
|
||||||
/// Application window's GL Context for Media player
|
/// Application window's GL Context for Media player
|
||||||
pub player_context: WindowGLContext,
|
pub player_context: WindowGLContext,
|
||||||
/// Mechanism to force the compositor to process events.
|
|
||||||
pub event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This trait allows creating a `ScriptThread` without depending on the `script`
|
/// This trait allows creating a `ScriptThread` without depending on the `script`
|
||||||
|
|
|
@ -454,8 +454,6 @@ where
|
||||||
|
|
||||||
webrender.set_external_image_handler(external_image_handlers);
|
webrender.set_external_image_handler(external_image_handlers);
|
||||||
|
|
||||||
let event_loop_waker = None;
|
|
||||||
|
|
||||||
// The division by 1 represents the page's default zoom of 100%,
|
// The division by 1 represents the page's default zoom of 100%,
|
||||||
// and gives us the appropriate CSSPixel type for the viewport.
|
// and gives us the appropriate CSSPixel type for the viewport.
|
||||||
let window_size = WindowSizeData {
|
let window_size = WindowSizeData {
|
||||||
|
@ -480,7 +478,6 @@ where
|
||||||
player_context,
|
player_context,
|
||||||
Some(webgl_threads),
|
Some(webgl_threads),
|
||||||
glplayer_threads,
|
glplayer_threads,
|
||||||
event_loop_waker,
|
|
||||||
window_size,
|
window_size,
|
||||||
external_images,
|
external_images,
|
||||||
wgpu_image_map,
|
wgpu_image_map,
|
||||||
|
@ -851,7 +848,6 @@ fn create_constellation(
|
||||||
player_context: WindowGLContext,
|
player_context: WindowGLContext,
|
||||||
webgl_threads: Option<WebGLThreads>,
|
webgl_threads: Option<WebGLThreads>,
|
||||||
glplayer_threads: Option<GLPlayerThreads>,
|
glplayer_threads: Option<GLPlayerThreads>,
|
||||||
event_loop_waker: Option<Box<dyn EventLoopWaker>>,
|
|
||||||
initial_window_size: WindowSizeData,
|
initial_window_size: WindowSizeData,
|
||||||
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
|
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
|
||||||
wgpu_image_map: Arc<Mutex<HashMap<u64, webgpu::PresentationData>>>,
|
wgpu_image_map: Arc<Mutex<HashMap<u64, webgpu::PresentationData>>>,
|
||||||
|
@ -899,7 +895,6 @@ fn create_constellation(
|
||||||
webgl_threads,
|
webgl_threads,
|
||||||
glplayer_threads,
|
glplayer_threads,
|
||||||
player_context,
|
player_context,
|
||||||
event_loop_waker,
|
|
||||||
user_agent,
|
user_agent,
|
||||||
webrender_external_images: external_images,
|
webrender_external_images: external_images,
|
||||||
wgpu_image_map,
|
wgpu_image_map,
|
||||||
|
@ -1046,7 +1041,6 @@ pub fn run_content_process(token: String) {
|
||||||
script::script_thread::ScriptThread>(
|
script::script_thread::ScriptThread>(
|
||||||
true,
|
true,
|
||||||
background_hang_monitor_register,
|
background_hang_monitor_register,
|
||||||
None,
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
content.start_all::<script_layout_interface::message::Msg,
|
content.start_all::<script_layout_interface::message::Msg,
|
||||||
|
@ -1054,7 +1048,6 @@ pub fn run_content_process(token: String) {
|
||||||
script::script_thread::ScriptThread>(
|
script::script_thread::ScriptThread>(
|
||||||
true,
|
true,
|
||||||
background_hang_monitor_register,
|
background_hang_monitor_register,
|
||||||
None,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue