duplex & tests
This commit is contained in:
parent
5cd6a04082
commit
99d127bb34
@ -32,6 +32,10 @@ pub struct Worker<S> where S: IpcInterface<S> {
|
|||||||
method_buf: [u8;2],
|
method_buf: [u8;2],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum SocketError {
|
||||||
|
DuplexLink
|
||||||
|
}
|
||||||
|
|
||||||
impl<S> Worker<S> where S: IpcInterface<S> {
|
impl<S> Worker<S> where S: IpcInterface<S> {
|
||||||
pub fn new(service: Arc<S>) -> Worker<S> {
|
pub fn new(service: Arc<S>) -> Worker<S> {
|
||||||
Worker::<S> {
|
Worker::<S> {
|
||||||
@ -43,8 +47,9 @@ impl<S> Worker<S> where S: IpcInterface<S> {
|
|||||||
|
|
||||||
pub fn poll(&mut self) {
|
pub fn poll(&mut self) {
|
||||||
for socket in self.sockets.iter_mut() {
|
for socket in self.sockets.iter_mut() {
|
||||||
if let Ok(method_sig_len) = socket.nb_read(&mut self.method_buf) {
|
// non-blocking read only ok if there is something to read from socket
|
||||||
if method_sig_len == 2 {
|
if let Ok(method_sign_len) = socket.nb_read(&mut self.method_buf) {
|
||||||
|
if method_sign_len == 2 {
|
||||||
let result = self.service.dispatch_buf(
|
let result = self.service.dispatch_buf(
|
||||||
self.method_buf[1] as u16 * 256 + self.method_buf[0] as u16,
|
self.method_buf[1] as u16 * 256 + self.method_buf[0] as u16,
|
||||||
socket);
|
socket);
|
||||||
@ -52,7 +57,50 @@ impl<S> Worker<S> where S: IpcInterface<S> {
|
|||||||
warn!(target: "ipc", "Failed to write response: {:?}", e);
|
warn!(target: "ipc", "Failed to write response: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
warn!(target: "ipc", "Failed to read method signature from socket: unexpected message length({})", method_sign_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_duplex(&mut self, addr: &str) -> Result<(), SocketError> {
|
||||||
|
let mut socket = try!(Socket::new(Protocol::Pair).map_err(|e| {
|
||||||
|
warn!(target: "ipc", "Failed to create ipc socket: {:?}", e);
|
||||||
|
SocketError::DuplexLink
|
||||||
|
}));
|
||||||
|
|
||||||
|
try!(socket.bind(addr).map_err(|e| {
|
||||||
|
warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", addr, e);
|
||||||
|
SocketError::DuplexLink
|
||||||
|
}));
|
||||||
|
|
||||||
|
self.sockets.push(socket);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
|
||||||
|
use super::Worker;
|
||||||
|
use ipc::*;
|
||||||
|
use std::io::Read;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
struct DummyService;
|
||||||
|
|
||||||
|
impl IpcInterface<DummyService> for DummyService {
|
||||||
|
fn dispatch<R>(&self, r: &mut R) -> Vec<u8> where R: Read {
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
fn dispatch_buf<R>(&self, method_num: u16, r: &mut R) -> Vec<u8> where R: Read {
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn can_create_worker() {
|
||||||
|
let worker = Worker::<DummyService>::new(Arc::new(DummyService));
|
||||||
|
assert_eq!(0, worker.sockets.len());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user