Skip to content

Commit f9fae6a

Browse files
author
rstade
committed
replaced deprecated function calls to Epoll in crate nix, which required quite some changes to the code in epoll.rs, mod.rs and tcp.rs
1 parent 872359a commit f9fae6a

5 files changed

Lines changed: 58 additions & 66 deletions

File tree

build.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,13 @@ case $TASK in
129129
done
130130
;;
131131
huge_pages)
132-
sudo dpdk-hugepages.py -p 2M --setup 8G
133-
sudo dpdk-hugepages.py -s
132+
./hugepages.sh
133+
// sudo dpdk-hugepages.py -p 2M --setup 8G
134+
// sudo dpdk-hugepages.py -s
134135
;;
135136
test)
136137
native
137-
huge_pages
138+
./hugepages.sh
138139
pushd $BASE_DIR/framework
139140
export LD_LIBRARY_PATH="${NATIVE_LIB_PATH}:${DPDK_LD_PATH}:${TOOLS_BASE}:${LD_LIBRARY_PATH}"
140141
# sudo -E env "PATH=$PATH" ${CARGO} test --release

framework/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "e2d2"
3-
version = "1.0.9"
4-
authors = ["Aurojit Panda <apanda@cs.berkeley.edu>", "Rainer Stademann"]
3+
version = "1.0.10"
4+
authors = ["Aurojit Panda <apanda@cs.berkeley.edu>", "Rainer Stademann <rainer.stademann@silverengine.de>"]
55
build = "build.rs"
66

77
[lib]
@@ -11,7 +11,7 @@ doctest = false
1111
libc = ">= 0.2.79"
1212
time = ">=0.1.0"
1313
chashmap = ">= 2.2.0"
14-
log = "0.3"
14+
log = ">=0.3"
1515
getopts = "*"
1616
byteorder = "*"
1717
fnv = "*"
@@ -21,15 +21,15 @@ lazy_static = "*"
2121
net2 = "*"
2222
# NIX restricts us to just unix for now, we can fix this if someone cares at a later point.
2323
nix = { version = ">=0.27.1", features =["event"] }
24-
toml = "0.6"
24+
toml = ">=0.6"
2525
# Hack for SHM
2626
uuid= { version = ">=0.7", features=["v4"] }
2727
tokio-core=">=0.1.8"
2828
futures=">=0.1.14"
2929
eui48 = { git= "https://github.com/readysettech/eui48.git", version= ">=1.1", features=["serde"] , default-features= false}
3030
separator = ">= 0.3"
31-
serde_derive = "1.0"
32-
serde = "1.0"
31+
serde_derive = ">=1.0"
32+
serde = ">=1.0"
3333
ipnet = ">=1.0"
3434

3535
[features]

framework/src/control/linux/epoll.rs

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,56 @@ use super::{Available, HUP, NONE, READ, WRITE};
22

33
use nix::sys::epoll::*;
44
use std::default::Default;
5-
use std::os::unix::io::AsRawFd;
6-
use std::os::unix::io::RawFd;
5+
use std::os::fd::AsFd;
76
use std::slice;
87

98
pub type Token = u64;
109

1110
pub struct PollHandle {
12-
epoll_fd: RawFd,
11+
epoll: Epoll,
1312
}
1413

1514
impl PollHandle {
16-
pub fn schedule_read<Fd: AsRawFd>(&self, file: &Fd, token: Token) {
17-
self.schedule_read_rawfd(file.as_raw_fd(), token);
18-
}
15+
// pub fn schedule_read<Fd: AsFd>(&self, file: &Fd, token: Token) {
16+
// self.schedule_read_rawfd(file, token).expect("schedule_read failed");
17+
// }
1918

20-
pub fn schedule_read_rawfd(&self, fd: RawFd, token: Token) {
21-
let mut event = EpollEvent::new(
19+
pub fn schedule_read<Fd: AsFd>(&self, fd: &Fd, token: Token) {
20+
let event = EpollEvent::new(
2221
EpollFlags::EPOLLIN | EpollFlags::EPOLLET | EpollFlags::EPOLLONESHOT,
2322
token,
2423
);
25-
epoll_ctl(self.epoll_fd, EpollOp::EpollCtlMod, fd, &mut event).unwrap();
24+
// epoll_ctl(self.epoll_fd, EpollOp::EpollCtlMod, fd, &mut event).unwrap();
25+
self.epoll.add(fd, event).expect("Epoll::add failed");
2626
}
2727

28-
pub fn schedule_write<Fd: AsRawFd>(&self, file: &Fd, token: Token) {
29-
self.schedule_write_rawfd(file.as_raw_fd(), token);
30-
}
28+
//pub fn schedule_write<Fd: AsRawFd>(&self, file: &Fd, token: Token) {
29+
// self.schedule_write_rawfd(file.as_raw_fd(), token);
30+
//}
3131

32-
pub fn schedule_write_rawfd(&self, fd: RawFd, token: Token) {
32+
pub fn schedule_write<Fd: AsFd>(&self, file: &Fd, token: Token) {
3333
let mut event = EpollEvent::new(
3434
EpollFlags::EPOLLOUT | EpollFlags::EPOLLET | EpollFlags::EPOLLONESHOT,
3535
token,
3636
);
37-
epoll_ctl(self.epoll_fd, EpollOp::EpollCtlMod, fd, &mut event).unwrap();
37+
//epoll_ctl(self.epoll_fd, EpollOp::EpollCtlMod, fd, &mut event).unwrap();
38+
self.epoll.modify(file, &mut event).expect("Epoll.modify failed");
3839
}
3940

4041
/// This assumes file is already set to be non-blocking. This must also be called only the first time round.
41-
pub fn new_io_port<Fd: AsRawFd>(&self, file: &Fd, token: Token) {
42-
self.new_io_fd(file.as_raw_fd(), token);
42+
pub fn new_io_port<Fd: AsFd>(&self, file: &Fd, token: Token) {
43+
self.new_io_fd(file, token);
4344
}
4445

45-
pub fn new_io_fd(&self, fd: RawFd, token: Token) {
46-
let mut event = EpollEvent::new(EpollFlags::EPOLLET | EpollFlags::EPOLLONESHOT, token);
47-
epoll_ctl(self.epoll_fd, EpollOp::EpollCtlAdd, fd, &mut event).unwrap();
46+
pub fn new_io_fd<Fd: AsFd>(&self, fd: Fd, token: Token) {
47+
let event = EpollEvent::new(EpollFlags::EPOLLET | EpollFlags::EPOLLONESHOT, token);
48+
//epoll_ctl(self.epoll_fd, EpollOp::EpollCtlAdd, fd, &mut event).unwrap();
49+
self.epoll.add(fd, event).expect("Epoll.add failed");
4850
}
4951
}
5052

5153
pub struct PollScheduler {
52-
epoll_fd: RawFd,
54+
poll_handle: PollHandle,
5355
ready_tokens: Vec<EpollEvent>,
5456
events: usize,
5557
}
@@ -61,15 +63,15 @@ impl Default for PollScheduler {
6163
}
6264

6365
impl PollScheduler {
64-
pub fn new_poll_handle(&self) -> PollHandle {
65-
PollHandle {
66-
epoll_fd: self.epoll_fd,
67-
}
66+
pub fn poll_handle(&self) -> &PollHandle {
67+
&self.poll_handle
6868
}
6969

7070
pub fn new() -> PollScheduler {
7171
PollScheduler {
72-
epoll_fd: epoll_create().unwrap(),
72+
poll_handle: PollHandle {
73+
epoll: Epoll::new(EpollCreateFlags::empty()).expect("Epoll::new failed"),
74+
}, // epoll_create().unwrap(),
7375
ready_tokens: Vec::with_capacity(32),
7476
events: 0,
7577
}
@@ -97,7 +99,8 @@ impl PollScheduler {
9799
} else {
98100
let dest =
99101
unsafe { slice::from_raw_parts_mut(self.ready_tokens.as_mut_ptr(), self.ready_tokens.capacity()) };
100-
self.events = epoll_wait(self.epoll_fd, dest, 0).unwrap();
102+
// self.events = epoll_wait(self.epoll_fd, dest, 0).unwrap();
103+
self.events = self.poll_handle.epoll.wait(dest, 0).expect("Epoll::wait failed");
101104
unsafe { self.ready_tokens.set_len(self.events) };
102105
self.ready_tokens.pop()
103106
}

framework/src/control/mod.rs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#[cfg(target_os = "linux")]
22
pub use self::epoll::*;
3+
use std::os::fd::AsFd;
34

45
#[cfg(target_os = "linux")]
56
#[path = "linux/epoll.rs"]
@@ -8,36 +9,30 @@ mod epoll;
89
pub mod sctp;
910
pub mod tcp;
1011

11-
use std::os::unix::io::RawFd;
12-
1312
pub type Available = u64;
1413

1514
pub const NONE: u64 = 0x0;
1615
pub const READ: u64 = 0x1;
1716
pub const WRITE: u64 = 0x2;
1817
pub const HUP: u64 = 0x4;
1918

20-
pub struct IOScheduler {
21-
fd: RawFd,
22-
scheduler: PollHandle,
19+
pub struct IOScheduler<'fd, Fd: AsFd> {
20+
fd: Fd,
21+
scheduler: &'fd PollHandle,
2322
token: Token,
2423
}
2524

26-
impl IOScheduler {
27-
pub fn new(scheduler: PollHandle, fd: RawFd, token: Token) -> IOScheduler {
28-
scheduler.new_io_fd(fd, token);
29-
IOScheduler {
30-
fd: fd,
31-
scheduler: scheduler,
32-
token: token,
33-
}
25+
impl<'fd, Fd: AsFd> IOScheduler<'fd, Fd> {
26+
pub fn new(scheduler: &'fd PollHandle, fd: Fd, token: Token) -> IOScheduler<Fd> {
27+
scheduler.new_io_fd(fd.as_fd(), token);
28+
IOScheduler { fd, scheduler, token }
3429
}
3530

3631
pub fn schedule_read(&self) {
37-
self.scheduler.schedule_read_rawfd(self.fd, self.token);
32+
self.scheduler.schedule_read(&self.fd, self.token);
3833
}
3934

4035
pub fn schedule_write(&self) {
41-
self.scheduler.schedule_write_rawfd(self.fd, self.token);
36+
self.scheduler.schedule_write(&self.fd, self.token);
4237
}
4338
}

framework/src/control/tcp.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{Available, IOScheduler, PollHandle, PollScheduler, Token, HUP, READ, WRITE};
1+
use super::{Available, PollScheduler, Token, HUP, READ, WRITE};
22
use fnv::FnvHasher;
33
/// TCP connection.
44
use net2::TcpBuilder;
@@ -8,10 +8,9 @@ use std::collections::HashMap;
88
use std::hash::BuildHasherDefault;
99
use std::marker::PhantomData;
1010
use std::net::*;
11-
use std::os::unix::io::AsRawFd;
1211

1312
pub trait TcpControlAgent {
14-
fn new(address: SocketAddr, stream: TcpStream, scheduler: IOScheduler) -> Self;
13+
fn new(address: SocketAddr, stream: TcpStream) -> Self;
1514
fn handle_read_ready(&mut self) -> bool;
1615
fn handle_write_ready(&mut self) -> bool;
1716
fn handle_hup(&mut self) -> bool;
@@ -21,7 +20,6 @@ type FnvHash = BuildHasherDefault<FnvHasher>;
2120
pub struct TcpControlServer<T: TcpControlAgent> {
2221
listener: TcpListener,
2322
scheduler: PollScheduler,
24-
handle: PollHandle,
2523
next_token: Token,
2624
listener_token: Token,
2725
phantom_t: PhantomData<T>,
@@ -53,13 +51,12 @@ impl<T: TcpControlAgent> TcpControlServer<T> {
5351
listener.set_nonblocking(true).unwrap();
5452
let scheduler = PollScheduler::new();
5553
let listener_token = 0;
56-
let handle = scheduler.new_poll_handle();
54+
let handle = scheduler.poll_handle();
5755
handle.new_io_port(&listener, listener_token);
5856
handle.schedule_read(&listener, listener_token);
5957
TcpControlServer {
6058
listener,
6159
scheduler,
62-
handle,
6360
next_token: listener_token + 1,
6461
listener_token,
6562
phantom_t: PhantomData,
@@ -88,15 +85,9 @@ impl<T: TcpControlAgent> TcpControlServer<T> {
8885
let token = self.next_token;
8986
self.next_token += 1;
9087
stream.set_nonblocking(true).unwrap();
91-
let stream_fd = stream.as_raw_fd();
92-
self.connections.insert(
93-
token,
94-
T::new(
95-
addr,
96-
stream,
97-
IOScheduler::new(self.scheduler.new_poll_handle(), stream_fd, token),
98-
),
99-
);
88+
//let stream_fd = stream.as_fd();
89+
//let scheduler = IOScheduler::new(self.scheduler.poll_handle(), stream_fd.clone(), token);
90+
self.connections.insert(token, T::new(addr, stream));
10091
// Add to some sort of hashmap.
10192
}
10293
Err(_) => {
@@ -106,7 +97,9 @@ impl<T: TcpControlAgent> TcpControlServer<T> {
10697
} else {
10798
// TODO: Report something.
10899
}
109-
self.handle.schedule_read(&self.listener, self.listener_token);
100+
self.scheduler
101+
.poll_handle()
102+
.schedule_read(&self.listener, self.listener_token);
110103
}
111104

112105
fn handle_data(&mut self, token: Token, available: Available) {

0 commit comments

Comments
 (0)