diff options
author | Gregory Terzian <gterzian@users.noreply.github.com> | 2019-01-27 20:20:32 +0800 |
---|---|---|
committer | Gregory Terzian <gterzian@users.noreply.github.com> | 2019-04-18 15:40:20 +0200 |
commit | c52cfda957a3aa85c8ee4abe6ce29dcb726e909e (patch) | |
tree | 9bfd4b573ea00d281c41d07c05c438dd2aa70bbe /components/net | |
parent | 1e4b42a90bae27040287ddae35e1979eed771dac (diff) | |
download | servo-c52cfda957a3aa85c8ee4abe6ce29dcb726e909e.tar.gz servo-c52cfda957a3aa85c8ee4abe6ce29dcb726e909e.zip |
use a threadpool for fetch
Diffstat (limited to 'components/net')
-rw-r--r-- | components/net/Cargo.toml | 1 | ||||
-rw-r--r-- | components/net/resource_thread.rs | 73 |
2 files changed, 38 insertions, 36 deletions
diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index af3b049cda3..d21dbd56f0e 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -44,6 +44,7 @@ net_traits = {path = "../net_traits"} openssl = "0.10" pixels = {path = "../pixels"} profile_traits = {path = "../profile_traits"} +rayon = "1" serde = "1.0" serde_json = "1.0" servo_allocator = {path = "../allocator"} diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 7a9dd49139c..376d5161864 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -398,6 +398,7 @@ pub struct CoreResourceManager { devtools_chan: Option<Sender<DevtoolsControlMsg>>, swmanager_chan: Option<IpcSender<CustomResponseMediator>>, filemanager: FileManager, + fetch_pool: rayon::ThreadPool, } impl CoreResourceManager { @@ -407,11 +408,16 @@ impl CoreResourceManager { _profiler_chan: ProfilerChan, embedder_proxy: EmbedderProxy, ) -> CoreResourceManager { + let pool = rayon::ThreadPoolBuilder::new() + .num_threads(16) + .build() + .unwrap(); CoreResourceManager { user_agent: user_agent, devtools_chan: devtools_channel, swmanager_chan: None, filemanager: FileManager::new(embedder_proxy), + fetch_pool: pool, } } @@ -446,42 +452,37 @@ impl CoreResourceManager { _ => ResourceTimingType::Resource, }; - thread::Builder::new() - .name(format!("fetch thread for {}", request_builder.url)) - .spawn(move || { - let mut request = request_builder.build(); - // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed) - // todo load context / mimesniff in fetch - // todo referrer policy? - // todo service worker stuff - let context = FetchContext { - state: http_state, - user_agent: ua, - devtools_chan: dc, - filemanager: filemanager, - cancellation_listener: Arc::new(Mutex::new(CancellationListener::new( - cancel_chan, - ))), - timing: Arc::new(Mutex::new(ResourceFetchTiming::new(request.timing_type()))), - }; - - match res_init_ { - Some(res_init) => { - let response = Response::from_init(res_init, timing_type); - http_redirect_fetch( - &mut request, - &mut CorsCache::new(), - response, - true, - &mut sender, - &mut None, - &context, - ); - }, - None => fetch(&mut request, &mut sender, &context), - }; - }) - .expect("Thread spawning failed"); + self.fetch_pool.spawn(move || { + let mut request = request_builder.build(); + // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed) + // todo load context / mimesniff in fetch + // todo referrer policy? + // todo service worker stuff + let context = FetchContext { + state: http_state, + user_agent: ua, + devtools_chan: dc, + filemanager: filemanager, + cancellation_listener: Arc::new(Mutex::new(CancellationListener::new(cancel_chan))), + timing: Arc::new(Mutex::new(ResourceFetchTiming::new(request.timing_type()))), + }; + + match res_init_ { + Some(res_init) => { + let response = Response::from_init(res_init, timing_type); + http_redirect_fetch( + &mut request, + &mut CorsCache::new(), + response, + true, + &mut sender, + &mut None, + &context, + ); + }, + None => fetch(&mut request, &mut sender, &context), + }; + }); } fn websocket_connect( |