From c0e7b859d76b89da22d4e48c8dda0997aad76726 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 10:18:39 +0300 Subject: [PATCH 1/6] client spawner --- ipc/codegen/src/codegen.rs | 27 ++++++++++++++++++++------- ipc/nano/src/lib.rs | 37 +++++++++++++++++++++++++++++++++++-- ipc/rpc/Cargo.toml | 1 + ipc/rpc/src/interface.rs | 12 +++++++++--- ipc/rpc/src/lib.rs | 3 ++- ipc/tests/Cargo.toml | 1 + ipc/tests/examples.rs | 6 +++--- ipc/tests/run.rs | 1 + 8 files changed, 72 insertions(+), 16 deletions(-) diff --git a/ipc/codegen/src/codegen.rs b/ipc/codegen/src/codegen.rs index c73bed22f..871771d1d 100644 --- a/ipc/codegen/src/codegen.rs +++ b/ipc/codegen/src/codegen.rs @@ -303,6 +303,7 @@ fn push_client( { push_client_struct(cx, builder, item, push); push_client_implementation(cx, builder, dispatches, item, push); + push_with_socket_client_implementation(cx, builder, item, push); } /// returns an expression with the body for single operation that is being sent to server @@ -485,6 +486,25 @@ fn implement_client_method( signature.unwrap() } +fn push_with_socket_client_implementation( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + item: &Item, + push: &mut FnMut(Annotatable)) +{ + let client_ident = builder.id(format!("{}Client", item.ident.name.as_str())); + let implement = quote_item!(cx, + impl ::ipc::WithSocket for $client_ident where S: ::ipc::IpcSocket { + fn init(socket: S) -> $client_ident { + $client_ident { + socket: ::std::cell::RefCell::new(socket), + phantom: ::std::marker::PhantomData, + } + } + }).unwrap(); + push(Annotatable::Item(implement)); +} + /// pushes full client side code for the original class exposed via ipc fn push_client_implementation( cx: &ExtCtxt, @@ -502,13 +522,6 @@ fn push_client_implementation( let item_ident = builder.id(format!("{}", item.ident.name.as_str())); let implement = quote_item!(cx, impl $client_ident where S: ::ipc::IpcSocket { - pub fn new(socket: S) -> $client_ident { - $client_ident { - socket: ::std::cell::RefCell::new(socket), - phantom: ::std::marker::PhantomData, - } - } - pub fn handshake(&self) -> Result<(), ::ipc::Error> { let payload = BinHandshake { protocol_version: $item_ident::protocol_version().to_string(), diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs index 6a0a3d4bf..4362448d5 100644 --- a/ipc/nano/src/lib.rs +++ b/ipc/nano/src/lib.rs @@ -20,10 +20,11 @@ extern crate ethcore_ipc as ipc; extern crate nanomsg; #[macro_use] extern crate log; -pub use ipc::*; +pub use ipc::{WithSocket, IpcInterface, IpcConfig}; use std::sync::*; use nanomsg::{Socket, Protocol, Error, Endpoint, PollRequest, PollFd, PollInOut}; +use std::ops::Deref; const POLL_TIMEOUT: isize = 100; @@ -34,6 +35,36 @@ pub struct Worker where S: IpcInterface { buf: Vec, } +pub struct GuardedSocket where S: WithSocket { + client: Arc, + _endpoint: Endpoint, +} + +impl Deref for GuardedSocket where S: WithSocket { + type Target = S; + + fn deref(&self) -> &S { + &self.client + } +} + +pub fn init_client(socket_addr: &str) -> Result, SocketError> where S: WithSocket { + let mut socket = try!(Socket::new(Protocol::Pair).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::DuplexLink + })); + + let endpoint = try!(socket.bind(socket_addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", socket_addr, e); + SocketError::DuplexLink + })); + + Ok(GuardedSocket { + client: Arc::new(S::init(socket)), + _endpoint: endpoint, + }) +} + #[derive(Debug)] pub enum SocketError { DuplexLink @@ -113,7 +144,7 @@ impl Worker where S: IpcInterface { } #[cfg(test)] -mod tests { +mod service_tests { use super::Worker; use ipc::*; @@ -150,6 +181,8 @@ mod tests { } } + impl IpcConfig for DummyService {} + fn dummy_write(addr: &str, buf: &[u8]) -> (Socket, Endpoint) { let mut socket = Socket::new(Protocol::Pair).unwrap(); let endpoint = socket.connect(addr).unwrap(); diff --git a/ipc/rpc/Cargo.toml b/ipc/rpc/Cargo.toml index b5177db41..a6346bbf9 100644 --- a/ipc/rpc/Cargo.toml +++ b/ipc/rpc/Cargo.toml @@ -9,3 +9,4 @@ license = "GPL-3.0" [dependencies] ethcore-devtools = { path = "../../devtools" } semver = "0.2.0" +nanomsg = "0.5.0" diff --git a/ipc/rpc/src/interface.rs b/ipc/rpc/src/interface.rs index 247b5339b..1c9b78703 100644 --- a/ipc/rpc/src/interface.rs +++ b/ipc/rpc/src/interface.rs @@ -18,7 +18,6 @@ use std::io::{Read, Write}; use std::marker::Sync; -use std::sync::atomic::*; use semver::Version; pub struct Handshake { @@ -47,7 +46,7 @@ pub enum Error { HandshakeFailed, } -pub trait IpcInterface where T: IpcConfig { +pub trait IpcInterface:IpcConfig { /// reads the message from io, dispatches the call and returns serialized result fn dispatch(&self, r: &mut R) -> Vec where R: Read; @@ -81,5 +80,12 @@ pub fn invoke(method_num: u16, params: &Option>, w: &mut W) where W: pub trait IpcSocket: Read + Write + Sync { } -impl IpcSocket for ::devtools::TestSocket { + +pub trait WithSocket { + fn init(socket: S) -> Self; } + + +impl IpcSocket for ::devtools::TestSocket {} + +impl IpcSocket for ::nanomsg::Socket {} diff --git a/ipc/rpc/src/lib.rs b/ipc/rpc/src/lib.rs index f0083e66e..c2165b6e5 100644 --- a/ipc/rpc/src/lib.rs +++ b/ipc/rpc/src/lib.rs @@ -18,6 +18,7 @@ extern crate ethcore_devtools as devtools; extern crate semver; +extern crate nanomsg; pub mod interface; -pub use interface::{IpcInterface, IpcSocket, invoke, IpcConfig, Handshake, Error}; +pub use interface::{IpcInterface, IpcSocket, invoke, IpcConfig, Handshake, Error, WithSocket}; diff --git a/ipc/tests/Cargo.toml b/ipc/tests/Cargo.toml index d6d066b93..931bf8061 100644 --- a/ipc/tests/Cargo.toml +++ b/ipc/tests/Cargo.toml @@ -13,6 +13,7 @@ bincode = "*" serde = "0.7.0" ethcore-devtools = { path = "../../devtools" } semver = "0.2.0" +nanomsg = "0.5.0" [build-dependencies] syntex = "0.30.0" diff --git a/ipc/tests/examples.rs b/ipc/tests/examples.rs index 931021d73..9d5eb37c4 100644 --- a/ipc/tests/examples.rs +++ b/ipc/tests/examples.rs @@ -63,7 +63,7 @@ mod tests { fn call_service_client() { let mut socket = TestSocket::new(); socket.read_buffer = vec![0, 0, 0, 10]; - let service_client = ServiceClient::new(socket); + let service_client = ServiceClient::init(socket); let result = service_client.commit(5); @@ -75,7 +75,7 @@ mod tests { fn call_service_client_optional() { let mut socket = TestSocket::new(); socket.read_buffer = vec![0, 0, 0, 10]; - let service_client = ServiceClient::new(socket); + let service_client = ServiceClient::init(socket); let result = service_client.rollback(Some(5), 10); @@ -95,7 +95,7 @@ mod tests { fn call_service_client_handshake() { let mut socket = TestSocket::new(); socket.read_buffer = vec![1]; - let service_client = ServiceClient::new(socket); + let service_client = ServiceClient::init(socket); let result = service_client.handshake(); diff --git a/ipc/tests/run.rs b/ipc/tests/run.rs index e464d186f..0b86fe368 100644 --- a/ipc/tests/run.rs +++ b/ipc/tests/run.rs @@ -19,6 +19,7 @@ extern crate ethcore_ipc as ipc; extern crate serde; extern crate ethcore_devtools as devtools; extern crate semver; +extern crate nanomsg; pub mod service; mod examples; From 98ab30d10295af6001b02bdc0dd2a42f7f1cd795 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 10:41:17 +0300 Subject: [PATCH 2/6] client & server dual tests (not working) --- ipc/tests/Cargo.toml | 2 ++ ipc/tests/over_nano.rs | 54 ++++++++++++++++++++++++++++++++++++++++++ ipc/tests/run.rs | 2 ++ 3 files changed, 58 insertions(+) create mode 100644 ipc/tests/over_nano.rs diff --git a/ipc/tests/Cargo.toml b/ipc/tests/Cargo.toml index 931bf8061..035de644c 100644 --- a/ipc/tests/Cargo.toml +++ b/ipc/tests/Cargo.toml @@ -14,6 +14,8 @@ serde = "0.7.0" ethcore-devtools = { path = "../../devtools" } semver = "0.2.0" nanomsg = "0.5.0" +ethcore-ipc-nano = { path = "../nano" } + [build-dependencies] syntex = "0.30.0" diff --git a/ipc/tests/over_nano.rs b/ipc/tests/over_nano.rs new file mode 100644 index 000000000..944f12c2e --- /dev/null +++ b/ipc/tests/over_nano.rs @@ -0,0 +1,54 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#[cfg(test)] +mod tests { + + use super::super::service::*; + use nanoipc; + use std::sync::Arc; + + fn init_worker(addr: &str) -> nanoipc::Worker { + let mut worker = nanoipc::Worker::::new(Arc::new(Service::new())); + worker.add_duplex(addr).unwrap(); + worker + } + + #[test] + fn can_create_client() { + let client = nanoipc::init_client::>("ipc:///tmp/parity-examples-test10.ipc"); + assert!(client.is_ok()); + } + + #[test] + fn can_call_handshake() { + let exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let url = "ipc:///tmp/parity-test-examples-20.ipc"; + + let worker_exit = exit.clone(); + ::std::thread::spawn(move || { + let mut worker = init_worker(url); + while !worker_exit.load(::std::sync::atomic::Ordering::Relaxed) { worker.poll() } + }); + let client = nanoipc::init_client::>(url).unwrap(); + + let hs = client.handshake(); + + exit.store(true, ::std::sync::atomic::Ordering::Relaxed); + assert!(hs.is_ok()); + } + +} diff --git a/ipc/tests/run.rs b/ipc/tests/run.rs index 0b86fe368..d3eb15287 100644 --- a/ipc/tests/run.rs +++ b/ipc/tests/run.rs @@ -20,6 +20,8 @@ extern crate serde; extern crate ethcore_devtools as devtools; extern crate semver; extern crate nanomsg; +extern crate ethcore_ipc_nano as nanoipc; pub mod service; mod examples; +mod over_nano; From 593ccd2510eda8a7f5205a3d73b17541d67b39e3 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 11:13:27 +0300 Subject: [PATCH 3/6] adding init wait --- ipc/nano/src/lib.rs | 2 +- ipc/tests/over_nano.rs | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs index 4362448d5..41f17018e 100644 --- a/ipc/nano/src/lib.rs +++ b/ipc/nano/src/lib.rs @@ -91,6 +91,7 @@ impl Worker where S: IpcInterface { match socket.nb_read_to_end(&mut self.buf) { Ok(method_sign_len) => { if method_sign_len >= 2 { + // method_num let method_num = self.buf[1] as u16 * 256 + self.buf[0] as u16; // payload @@ -186,7 +187,6 @@ mod service_tests { fn dummy_write(addr: &str, buf: &[u8]) -> (Socket, Endpoint) { let mut socket = Socket::new(Protocol::Pair).unwrap(); let endpoint = socket.connect(addr).unwrap(); - //thread::sleep_ms(10); socket.write(buf).unwrap(); (socket, endpoint) } diff --git a/ipc/tests/over_nano.rs b/ipc/tests/over_nano.rs index 944f12c2e..56ea94d61 100644 --- a/ipc/tests/over_nano.rs +++ b/ipc/tests/over_nano.rs @@ -29,25 +29,33 @@ mod tests { #[test] fn can_create_client() { - let client = nanoipc::init_client::>("ipc:///tmp/parity-examples-test10.ipc"); + let client = nanoipc::init_client::>("ipc:///tmp/parity-nano-test10.ipc"); assert!(client.is_ok()); } #[test] fn can_call_handshake() { - let exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); - let url = "ipc:///tmp/parity-test-examples-20.ipc"; + let worker_should_exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let worker_is_ready = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let c_worker_should_exit = worker_should_exit.clone(); + let c_worker_is_ready = worker_is_ready.clone(); + + let url = "ipc:///tmp/parity-test-nano-20.ipc"; - let worker_exit = exit.clone(); ::std::thread::spawn(move || { let mut worker = init_worker(url); - while !worker_exit.load(::std::sync::atomic::Ordering::Relaxed) { worker.poll() } + while !c_worker_should_exit.load(::std::sync::atomic::Ordering::Relaxed) { + worker.poll(); + c_worker_is_ready.store(true, ::std::sync::atomic::Ordering::Relaxed); + } }); + + while !worker_is_ready.load(::std::sync::atomic::Ordering::Relaxed) { } let client = nanoipc::init_client::>(url).unwrap(); let hs = client.handshake(); - exit.store(true, ::std::sync::atomic::Ordering::Relaxed); + worker_should_exit.store(true, ::std::sync::atomic::Ordering::Relaxed); assert!(hs.is_ok()); } From 9b329296e43c2b2843bdc0db91d7a84e8bafad1c Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 11:34:56 +0300 Subject: [PATCH 4/6] working client spawn --- ipc/codegen/src/codegen.rs | 2 +- ipc/nano/src/lib.rs | 2 +- ipc/rpc/src/interface.rs | 1 + ipc/tests/over_nano.rs | 50 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/ipc/codegen/src/codegen.rs b/ipc/codegen/src/codegen.rs index 871771d1d..671e067b3 100644 --- a/ipc/codegen/src/codegen.rs +++ b/ipc/codegen/src/codegen.rs @@ -526,7 +526,7 @@ fn push_client_implementation( let payload = BinHandshake { protocol_version: $item_ident::protocol_version().to_string(), api_version: $item_ident::api_version().to_string(), - _reserved: vec![0u8, 64], + _reserved: vec![0u8; 64], }; let mut socket_ref = self.socket.borrow_mut(); diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs index 41f17018e..9d74325fa 100644 --- a/ipc/nano/src/lib.rs +++ b/ipc/nano/src/lib.rs @@ -54,7 +54,7 @@ pub fn init_client(socket_addr: &str) -> Result, SocketError SocketError::DuplexLink })); - let endpoint = try!(socket.bind(socket_addr).map_err(|e| { + let endpoint = try!(socket.connect(socket_addr).map_err(|e| { warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", socket_addr, e); SocketError::DuplexLink })); diff --git a/ipc/rpc/src/interface.rs b/ipc/rpc/src/interface.rs index 1c9b78703..5c0d57612 100644 --- a/ipc/rpc/src/interface.rs +++ b/ipc/rpc/src/interface.rs @@ -69,6 +69,7 @@ pub fn invoke(method_num: u16, params: &Option>, w: &mut W) where W: if params.is_some() { buf[2..buf_len].clone_from_slice(params.as_ref().unwrap()); } + if w.write(&buf).unwrap() != buf_len { // if write was inconsistent diff --git a/ipc/tests/over_nano.rs b/ipc/tests/over_nano.rs index 56ea94d61..731163638 100644 --- a/ipc/tests/over_nano.rs +++ b/ipc/tests/over_nano.rs @@ -20,6 +20,15 @@ mod tests { use super::super::service::*; use nanoipc; use std::sync::Arc; + use std::io::{Write, Read}; + + fn dummy_write(addr: &str, buf: &[u8]) -> (::nanomsg::Socket, ::nanomsg::Endpoint) { + let mut socket = ::nanomsg::Socket::new(::nanomsg::Protocol::Pair).unwrap(); + let endpoint = socket.connect(addr).unwrap(); + socket.write(buf).unwrap(); + (socket, endpoint) + } + fn init_worker(addr: &str) -> nanoipc::Worker { let mut worker = nanoipc::Worker::::new(Arc::new(Service::new())); @@ -35,13 +44,12 @@ mod tests { #[test] fn can_call_handshake() { + let url = "ipc:///tmp/parity-test-nano-20.ipc"; let worker_should_exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); let worker_is_ready = Arc::new(::std::sync::atomic::AtomicBool::new(false)); let c_worker_should_exit = worker_should_exit.clone(); let c_worker_is_ready = worker_is_ready.clone(); - let url = "ipc:///tmp/parity-test-nano-20.ipc"; - ::std::thread::spawn(move || { let mut worker = init_worker(url); while !c_worker_should_exit.load(::std::sync::atomic::Ordering::Relaxed) { @@ -59,4 +67,42 @@ mod tests { assert!(hs.is_ok()); } + #[test] + fn can_receive_dummy_writes_in_thread() { + let url = "ipc:///tmp/parity-test-nano-30.ipc"; + let worker_should_exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let worker_is_ready = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let c_worker_should_exit = worker_should_exit.clone(); + let c_worker_is_ready = worker_is_ready.clone(); + + ::std::thread::spawn(move || { + let mut worker = init_worker(url); + while !c_worker_should_exit.load(::std::sync::atomic::Ordering::Relaxed) { + worker.poll(); + c_worker_is_ready.store(true, ::std::sync::atomic::Ordering::Relaxed); + } + }); + while !worker_is_ready.load(::std::sync::atomic::Ordering::Relaxed) { } + + let (mut _s, _e) = dummy_write(url, &vec![0, 0, + // protocol version + 0, 0, 0, 0, 0, 0, 0, 5, b'1', b'.', b'0', b'.', b'0', + // api version + 0, 0, 0, 0, 0, 0, 0, 5, b'1', b'.', b'0', b'.', b'0', + // reserved + 0, 0, 0, 0, 0, 0, 0, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + let mut buf = vec![0u8;1]; + let result = _s.read(&mut buf); + assert_eq!(1, buf.len()); + assert_eq!(1, buf[0]); + + worker_should_exit.store(true, ::std::sync::atomic::Ordering::Relaxed); + } + } From 36515570b40824011a2aad03b9c1e169ccdfc9a7 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 11:41:26 +0300 Subject: [PATCH 5/6] removed global paths and fix warn --- ipc/tests/over_nano.rs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/ipc/tests/over_nano.rs b/ipc/tests/over_nano.rs index 731163638..720dff81d 100644 --- a/ipc/tests/over_nano.rs +++ b/ipc/tests/over_nano.rs @@ -21,6 +21,7 @@ mod tests { use nanoipc; use std::sync::Arc; use std::io::{Write, Read}; + use std::sync::atomic::{Ordering, AtomicBool}; fn dummy_write(addr: &str, buf: &[u8]) -> (::nanomsg::Socket, ::nanomsg::Endpoint) { let mut socket = ::nanomsg::Socket::new(::nanomsg::Protocol::Pair).unwrap(); @@ -45,44 +46,44 @@ mod tests { #[test] fn can_call_handshake() { let url = "ipc:///tmp/parity-test-nano-20.ipc"; - let worker_should_exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); - let worker_is_ready = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let worker_should_exit = Arc::new(AtomicBool::new(false)); + let worker_is_ready = Arc::new(AtomicBool::new(false)); let c_worker_should_exit = worker_should_exit.clone(); let c_worker_is_ready = worker_is_ready.clone(); ::std::thread::spawn(move || { let mut worker = init_worker(url); - while !c_worker_should_exit.load(::std::sync::atomic::Ordering::Relaxed) { + while !c_worker_should_exit.load(Ordering::Relaxed) { worker.poll(); - c_worker_is_ready.store(true, ::std::sync::atomic::Ordering::Relaxed); + c_worker_is_ready.store(true, Ordering::Relaxed); } }); - while !worker_is_ready.load(::std::sync::atomic::Ordering::Relaxed) { } + while !worker_is_ready.load(Ordering::Relaxed) { } let client = nanoipc::init_client::>(url).unwrap(); let hs = client.handshake(); - worker_should_exit.store(true, ::std::sync::atomic::Ordering::Relaxed); + worker_should_exit.store(true, Ordering::Relaxed); assert!(hs.is_ok()); } #[test] fn can_receive_dummy_writes_in_thread() { let url = "ipc:///tmp/parity-test-nano-30.ipc"; - let worker_should_exit = Arc::new(::std::sync::atomic::AtomicBool::new(false)); - let worker_is_ready = Arc::new(::std::sync::atomic::AtomicBool::new(false)); + let worker_should_exit = Arc::new(AtomicBool::new(false)); + let worker_is_ready = Arc::new(AtomicBool::new(false)); let c_worker_should_exit = worker_should_exit.clone(); let c_worker_is_ready = worker_is_ready.clone(); ::std::thread::spawn(move || { let mut worker = init_worker(url); - while !c_worker_should_exit.load(::std::sync::atomic::Ordering::Relaxed) { + while !c_worker_should_exit.load(Ordering::Relaxed) { worker.poll(); - c_worker_is_ready.store(true, ::std::sync::atomic::Ordering::Relaxed); + c_worker_is_ready.store(true, Ordering::Relaxed); } }); - while !worker_is_ready.load(::std::sync::atomic::Ordering::Relaxed) { } + while !worker_is_ready.load(Ordering::Relaxed) { } let (mut _s, _e) = dummy_write(url, &vec![0, 0, // protocol version @@ -98,11 +99,11 @@ mod tests { ]); let mut buf = vec![0u8;1]; - let result = _s.read(&mut buf); + _s.read(&mut buf).unwrap(); assert_eq!(1, buf.len()); assert_eq!(1, buf[0]); - worker_should_exit.store(true, ::std::sync::atomic::Ordering::Relaxed); + worker_should_exit.store(true, Ordering::Relaxed); } } From ef3e9489a84354a7b73bb6e533940d4ca6ef8d1c Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 12 Apr 2016 12:18:48 +0300 Subject: [PATCH 6/6] missing space --- ipc/rpc/src/interface.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipc/rpc/src/interface.rs b/ipc/rpc/src/interface.rs index 5c0d57612..59da58092 100644 --- a/ipc/rpc/src/interface.rs +++ b/ipc/rpc/src/interface.rs @@ -46,7 +46,7 @@ pub enum Error { HandshakeFailed, } -pub trait IpcInterface:IpcConfig { +pub trait IpcInterface: IpcConfig { /// reads the message from io, dispatches the call and returns serialized result fn dispatch(&self, r: &mut R) -> Vec where R: Read;