From 4b3f23f0accb844c1a746e94fc829fdc72cf8e27 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 20 Jun 2016 01:06:00 +0200 Subject: [PATCH] Fixed network service dispose --- parity/io_handler.rs | 14 +++++++++----- parity/main.rs | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/parity/io_handler.rs b/parity/io_handler.rs index ee6d6130f..a94582b1d 100644 --- a/parity/io_handler.rs +++ b/parity/io_handler.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -use std::sync::Arc; +use std::sync::{Arc, Weak}; use ethcore::client::Client; use ethcore::service::{NetSyncMessage, SyncMessage}; use ethsync::EthSync; @@ -30,7 +30,7 @@ pub struct ClientIoHandler { pub sync: Arc, pub accounts: Arc, pub info: Informant, - pub network: Arc>, + pub network: Weak>, } impl IoHandler for ClientIoHandler { @@ -49,12 +49,16 @@ impl IoHandler for ClientIoHandler { match *message { NetworkIoMessage::User(SyncMessage::StartNetwork) => { info!("Starting network"); - self.network.start().unwrap_or_else(|e| warn!("Error starting network: {:?}", e)); - EthSync::register(&*self.network, self.sync.clone()).unwrap_or_else(|e| warn!("Error registering eth protocol handler: {}", e)); + if let Some(network) = self.network.upgrade() { + network.start().unwrap_or_else(|e| warn!("Error starting network: {:?}", e)); + EthSync::register(&*network, self.sync.clone()).unwrap_or_else(|e| warn!("Error registering eth protocol handler: {}", e)); + } }, NetworkIoMessage::User(SyncMessage::StopNetwork) => { info!("Stopping network"); - self.network.stop().unwrap_or_else(|e| warn!("Error stopping network: {:?}", e)); + if let Some(network) = self.network.upgrade() { + network.stop().unwrap_or_else(|e| warn!("Error stopping network: {:?}", e)); + } }, _ => {/* Ignore other messages */}, } diff --git a/parity/main.rs b/parity/main.rs index 9680f8a03..5bc5f1b48 100644 --- a/parity/main.rs +++ b/parity/main.rs @@ -272,7 +272,7 @@ fn execute_client(conf: Configuration, spec: Spec, client_config: ClientConfig) info: Informant::new(conf.have_color()), sync: sync.clone(), accounts: account_service.clone(), - network: service.network(), + network: Arc::downgrade(&service.network()), }); service.register_io_handler(io_handler).expect("Error registering IO handler");