1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use futures::prelude::*;
use futures::{future::BoxFuture, task::SpawnError};
use futures_timer::{Delay as AsyncDelay, Interval as AsyncInterval};
use lazy_static::lazy_static;
use std::io;
use std::net::SocketAddr;
use std::pin::Pin;
use std::time::{Duration, Instant};
mod tcp;
mod time;
mod udp;
use tcp::{TcpListener, TcpStream};
use time::{Delay, Interval};
use udp::UdpSocket;
lazy_static! {
static ref JULIEX_THREADPOOL: juliex::ThreadPool = {
juliex::ThreadPool::with_setup(|| {
runtime_raw::set_runtime(&Native);
})
};
}
#[derive(Debug)]
pub struct Native;
impl runtime_raw::Runtime for Native {
fn spawn_boxed(&self, fut: BoxFuture<'static, ()>) -> Result<(), SpawnError> {
JULIEX_THREADPOOL.spawn_boxed(fut.into());
Ok(())
}
fn connect_tcp_stream(
&self,
addr: &SocketAddr,
) -> BoxFuture<'static, io::Result<Pin<Box<dyn runtime_raw::TcpStream>>>> {
let romio_connect = romio::TcpStream::connect(addr);
let connect = romio_connect.map(|res| {
res.map(|romio_stream| {
Box::pin(TcpStream { romio_stream }) as Pin<Box<dyn runtime_raw::TcpStream>>
})
});
connect.boxed()
}
fn bind_tcp_listener(
&self,
addr: &SocketAddr,
) -> io::Result<Pin<Box<dyn runtime_raw::TcpListener>>> {
let romio_listener = romio::TcpListener::bind(&addr)?;
Ok(Box::pin(TcpListener { romio_listener }))
}
fn bind_udp_socket(
&self,
addr: &SocketAddr,
) -> io::Result<Pin<Box<dyn runtime_raw::UdpSocket>>> {
let romio_socket = romio::UdpSocket::bind(&addr)?;
Ok(Box::pin(UdpSocket { romio_socket }))
}
fn new_delay(&self, dur: Duration) -> Pin<Box<dyn runtime_raw::Delay>> {
let async_delay = AsyncDelay::new(dur);
Box::pin(Delay { async_delay })
}
fn new_delay_at(&self, at: Instant) -> Pin<Box<dyn runtime_raw::Delay>> {
let async_delay = AsyncDelay::new_at(at);
Box::pin(Delay { async_delay })
}
fn new_interval(&self, dur: Duration) -> Pin<Box<dyn runtime_raw::Interval>> {
let async_interval = AsyncInterval::new(dur);
Box::pin(Interval { async_interval })
}
}