diff options
author | Alex Johnson <hello@alex-johnson.net> | 2019-05-25 20:48:38 -0700 |
---|---|---|
committer | Alex Johnson <hello@alex-johnson.net> | 2019-05-26 09:46:48 -0700 |
commit | 1c35c44c35d41b3503f9402fb8771d71631cf0cb (patch) | |
tree | add50522de4895ba951f81c0f3c8464d2a1e1c4a | |
parent | 4aad79f9d223decab338ac6e0cdcbc7b13df7b1b (diff) | |
download | servo-1c35c44c35d41b3503f9402fb8771d71631cf0cb.tar.gz servo-1c35c44c35d41b3503f9402fb8771d71631cf0cb.zip |
Fixes #23408
Switched from using thread for websocket requests to ipc_channel::router::ROUTER
Signed-off-by: Alex Johnson <hello@alex-johnson.net>
-rw-r--r-- | components/script/dom/websocket.rs | 73 |
1 files changed, 36 insertions, 37 deletions
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 530d2ca6f76..5f783ab5a30 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -27,6 +27,7 @@ use crate::task_source::websocket::WebsocketTaskSource; use crate::task_source::TaskSource; use dom_struct::dom_struct; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use ipc_channel::router::ROUTER; use js::jsapi::{JSAutoRealm, JSObject}; use js::jsval::UndefinedValue; use js::rust::CustomAutoRooterGuard; @@ -40,7 +41,6 @@ use servo_url::{ImmutableOrigin, ServoUrl}; use std::borrow::ToOwned; use std::cell::Cell; use std::ptr; -use std::thread; #[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)] enum WebSocketRequestState { @@ -216,42 +216,41 @@ impl WebSocket { let task_source = global.websocket_task_source(); let canceller = global.task_canceller(WebsocketTaskSource::NAME); - thread::spawn(move || { - while let Ok(event) = dom_event_receiver.recv() { - match event { - WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use } => { - let open_thread = ConnectionEstablishedTask { - address: address.clone(), - protocol_in_use, - }; - task_source - .queue_with_canceller(open_thread, &canceller) - .unwrap(); - }, - WebSocketNetworkEvent::MessageReceived(message) => { - let message_thread = MessageReceivedTask { - address: address.clone(), - message: message, - }; - task_source - .queue_with_canceller(message_thread, &canceller) - .unwrap(); - }, - WebSocketNetworkEvent::Fail => { - fail_the_websocket_connection(address.clone(), &task_source, &canceller); - }, - WebSocketNetworkEvent::Close(code, reason) => { - close_the_websocket_connection( - address.clone(), - &task_source, - &canceller, - code, - reason, - ); - }, - } - } - }); + ROUTER.add_route( + dom_event_receiver.to_opaque(), + Box::new(move |message| match message.to().unwrap() { + WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use } => { + let open_thread = ConnectionEstablishedTask { + address: address.clone(), + protocol_in_use, + }; + task_source + .queue_with_canceller(open_thread, &canceller) + .unwrap(); + }, + WebSocketNetworkEvent::MessageReceived(message) => { + let message_thread = MessageReceivedTask { + address: address.clone(), + message: message, + }; + task_source + .queue_with_canceller(message_thread, &canceller) + .unwrap(); + }, + WebSocketNetworkEvent::Fail => { + fail_the_websocket_connection(address.clone(), &task_source, &canceller); + }, + WebSocketNetworkEvent::Close(code, reason) => { + close_the_websocket_connection( + address.clone(), + &task_source, + &canceller, + code, + reason, + ); + }, + }), + ); // Step 7. Ok(ws) |