aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xmlhttprequest.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2015-07-09 16:50:06 -0700
committerPatrick Walton <pcwalton@mimiga.net>2015-07-31 11:27:49 -0700
commit44d13f7fd419bdff1420ed21ca3efd72f4015bfa (patch)
treeeef95c16a10775746262be4eb8fae0859b7ae15d /components/script/dom/xmlhttprequest.rs
parent9c9d7dc93b1d64b1524eb2bdcbdc817319abc8b9 (diff)
downloadservo-44d13f7fd419bdff1420ed21ca3efd72f4015bfa.tar.gz
servo-44d13f7fd419bdff1420ed21ca3efd72f4015bfa.zip
net: Use a thread for each `AsyncResponseTarget` to avoid having to send
trait objects across process boundaries.
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r--components/script/dom/xmlhttprequest.rs14
1 files changed, 10 insertions, 4 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index 7cb33d1b023..ed4bfe1a705 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -46,8 +46,8 @@ use js::jsval::{JSVal, NullValue, UndefinedValue};
use net_traits::ControlMsg::Load;
use net_traits::{ResourceTask, ResourceCORSData, LoadData, LoadConsumer};
-use net_traits::{AsyncResponseListener, Metadata, SerializableHeaders, SerializableMethod};
-use net_traits::{SerializableUrl};
+use net_traits::{AsyncResponseListener, AsyncResponseTarget, Metadata, SerializableHeaders};
+use net_traits::{SerializableMethod, SerializableUrl};
use cors::{allow_cross_origin_request, CORSRequest, RequestMode, AsyncCORSResponseListener};
use cors::CORSResponse;
use util::str::DOMString;
@@ -59,7 +59,7 @@ use std::cell::{RefCell, Cell};
use std::default::Default;
use std::sync::{Mutex, Arc};
use std::sync::mpsc::{channel, Sender, TryRecvError};
-use std::thread::sleep_ms;
+use std::thread::{self, sleep_ms};
use time;
use url::{Url, UrlParser};
@@ -271,11 +271,17 @@ impl XMLHttpRequest {
}
}
+ let (action_sender, action_receiver) = channel();
let listener = box NetworkListener {
context: context,
script_chan: script_chan,
+ receiver: action_receiver,
};
- resource_task.send(Load(load_data, LoadConsumer::Listener(listener))).unwrap();
+ let response_target = AsyncResponseTarget {
+ sender: action_sender,
+ };
+ thread::spawn(move || listener.run());
+ resource_task.send(Load(load_data, LoadConsumer::Listener(response_target))).unwrap();
}
}