1
0
mirror of https://github.com/fafhrd91/actix-net synced 2025-08-13 02:47:08 +02:00

Compare commits

..

10 Commits

Author SHA1 Message Date
Nikolay Kim
a80e1f8370 fix new() method and make from_static and from_bytes_unchecked methods const 2019-12-22 16:24:28 +04:00
Nikolay Kim
5fe759cc02 Merge branch 'master' of github.com:actix/actix-net 2019-12-20 09:15:19 +06:00
Nikolay Kim
05549f0b42 Add methods to check LocalWaker registration state 2019-12-20 09:13:11 +06:00
Yuki Okushi
b1430eaded Run tests for all features as possible (#78) 2019-12-19 16:31:32 +09:00
Nikolay Kim
0d3f9e74c5 Use .advance() intead of .split_to() 2019-12-19 09:50:31 +06:00
Nikolay Kim
cab73791ed pin trsut-dns-proto 2019-12-15 13:04:26 +06:00
Nikolay Kim
a7ac1a76ed add license files to actix-macros 2019-12-14 23:01:55 +06:00
Nikolay Kim
37bedff6fb use parking_lot 0.10 2019-12-12 06:57:40 +06:00
Nikolay Kim
33fd6adc11 better InOrder test 2019-12-12 06:56:45 +06:00
Nikolay Kim
4305cdba2c Revert InOrder service changes 2019-12-11 23:10:02 +06:00
20 changed files with 119 additions and 41 deletions

View File

@@ -2,6 +2,9 @@ name: CI
on: [push, pull_request]
env:
VCPKGRS_DYNAMIC: 1
jobs:
build_and_test:
strategy:
@@ -18,10 +21,12 @@ jobs:
include:
- toolchain: x86_64-pc-windows-msvc
os: windows-latest
arch: x64
- toolchain: x86_64-pc-windows-gnu
os: windows-latest
- toolchain: i686-pc-windows-msvc
os: windows-latest
arch: x86
- toolchain: x86_64-apple-darwin
os: macOS-latest
@@ -37,6 +42,13 @@ jobs:
toolchain: ${{ matrix.version }}-${{ matrix.toolchain }}
default: true
- name: Install OpenSSL
if: matrix.toolchain == 'x86_64-pc-windows-msvc' || matrix.toolchain == 'i686-pc-windows-msvc'
run: |
vcpkg integrate install
vcpkg install openssl:${{ matrix.arch }}-windows
- name: check nightly
if: matrix.version == 'nightly'
uses: actions-rs/cargo@v1
@@ -52,6 +64,14 @@ jobs:
args: --all --bins --examples --tests
- name: tests
if: matrix.toolchain != 'x86_64-pc-windows-gnu'
uses: actions-rs/cargo@v1
with:
command: test
args: --all --all-features -- --nocapture
- name: tests on x86_64-pc-windows-gnu
if: matrix.toolchain == 'x86_64-pc-windows-gnu'
uses: actions-rs/cargo@v1
with:
command: test

View File

@@ -1,5 +1,7 @@
# Changes
* Use `.advance()` intead of `.split_to()`
## [0.2.0] - 2019-12-10
* Use specific futures dependencies

View File

@@ -2,7 +2,7 @@ use std::pin::Pin;
use std::task::{Context, Poll};
use std::{fmt, io};
use bytes::BytesMut;
use bytes::{Buf, BytesMut};
use futures_core::{ready, Stream};
use futures_sink::Sink;
@@ -288,7 +288,7 @@ impl<T, U> Framed<T, U> {
}
// remove written data
let _ = self.write_buf.split_to(n);
self.write_buf.advance(n);
}
// Try flushing the underlying IO

View File

@@ -1,5 +1,9 @@
# Changes
## [1.0.1] - 2019-12-15
* Fix trust-dns-resolver compilation
## [1.0.0] - 2019-12-11
* Release

View File

@@ -1,6 +1,6 @@
[package]
name = "actix-connect"
version = "1.0.0"
version = "1.0.1"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix connect - tcp connector service"
keywords = ["network", "framework", "async", "futures"]
@@ -34,14 +34,15 @@ uri = ["http"]
[dependencies]
actix-service = "1.0.0"
actix-codec = "0.2.0"
actix-utils = "1.0.0"
actix-utils = "1.0.3"
actix-rt = "1.0.0"
derive_more = "0.99.2"
either = "1.5.2"
futures = "0.3.1"
http = { version = "0.2.0", optional = true }
log = "0.4"
trust-dns-resolver = { version="0.18.0-alpha.2", default-features = false, features=["tokio"] }
trust-dns-proto = "=0.18.0-alpha.2"
trust-dns-resolver = "=0.18.0-alpha.2"
# openssl
open-ssl = { version="0.10", package = "openssl", optional = true }
@@ -53,5 +54,5 @@ tokio-rustls = { version = "0.12.0", optional = true }
webpki = { version = "0.21", optional = true }
[dev-dependencies]
bytes = "0.5.2"
bytes = "0.5.3"
actix-testing = { version="1.0.0" }

View File

@@ -1,6 +1,6 @@
[package]
name = "actix-macros"
version = "0.1.0"
version = "0.1.1"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix runtime macros"
repository = "https://github.com/actix/actix-net"

1
actix-macros/LICENSE-APACHE Symbolic link
View File

@@ -0,0 +1 @@
../LICENSE-APACHE

1
actix-macros/LICENSE-MIT Symbolic link
View File

@@ -0,0 +1 @@
../LICENSE-MIT

View File

@@ -71,7 +71,7 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream {
if input.sig.asyncness.is_none() {
return syn::Error::new_spanned(
input.sig.fn_token,
format!("only async fn is supported, {:?}", input.sig.ident),
format!("only async fn is supported, {}", input.sig.ident),
)
.to_compile_error()
.into();

View File

@@ -10,7 +10,6 @@ documentation = "https://docs.rs/actix-rt/"
categories = ["network-programming", "asynchronous"]
license = "MIT/Apache-2.0"
edition = "2018"
workspace = ".."
[lib]
name = "actix_rt"
@@ -21,4 +20,4 @@ actix-macros = "0.1.0"
actix-threadpool = "0.3"
futures = "0.3.1"
copyless = "0.1.4"
tokio = { version = "0.2.4", default-features=false, features = ["rt-core", "rt-util", "io-driver", "tcp", "uds", "udp", "time", "signal", "stream"] }
tokio = { version = "0.2.6", default-features=false, features = ["rt-core", "rt-util", "io-driver", "tcp", "uds", "udp", "time", "signal", "stream"] }

View File

@@ -1,5 +1,11 @@
# Changes
## [0.3.1] - 2019-12-12
### Changed
* Use parking_lot 0.10
## [0.3.0] - 2019-12-02
### Changed

View File

@@ -1,6 +1,6 @@
[package]
name = "actix-threadpool"
version = "0.3.0"
version = "0.3.1"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix thread pool for sync code"
keywords = ["actix", "network", "framework", "async", "futures"]
@@ -19,9 +19,9 @@ path = "src/lib.rs"
[dependencies]
derive_more = "0.99.2"
futures = "0.3.1"
parking_lot = "0.9"
lazy_static = "1.2"
futures-channel = "0.3.1"
parking_lot = "0.10"
lazy_static = "1.3"
log = "0.4"
num_cpus = "1.10"
threadpool = "1.7"

View File

@@ -6,7 +6,7 @@ use std::pin::Pin;
use std::task::{Context, Poll};
use derive_more::Display;
use futures::channel::oneshot;
use futures_channel::oneshot;
use parking_lot::Mutex;
use threadpool::ThreadPool;
@@ -79,9 +79,12 @@ impl<I, E: fmt::Debug> Future for CpuFuture<I, E> {
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let rx = Pin::new(&mut self.rx);
let res = futures::ready!(rx.poll(cx))
.map_err(|_| BlockingError::Canceled)
.and_then(|res| res.map_err(BlockingError::Error));
let res = match rx.poll(cx) {
Poll::Pending => return Poll::Pending,
Poll::Ready(res) => res
.map_err(|_| BlockingError::Canceled)
.and_then(|res| res.map_err(BlockingError::Error)),
};
Poll::Ready(res)
}
}

View File

@@ -1,5 +1,13 @@
# Changes
## [1.0.4] - 2019-12-20
* Add methods to check `LocalWaker` registration state.
## [1.0.3] - 2019-12-11
* Revert InOrder service changes
## [1.0.2] - 2019-12-11
* Allow to create `framed::Dispatcher` with custom `mpsc::Receiver`

View File

@@ -1,6 +1,6 @@
[package]
name = "actix-utils"
version = "1.0.2"
version = "1.0.4"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix utils - various actix net related services"
keywords = ["network", "framework", "async", "futures"]
@@ -10,7 +10,6 @@ documentation = "https://docs.rs/actix-utils/"
categories = ["network-programming", "asynchronous"]
license = "MIT/Apache-2.0"
edition = "2018"
workspace = ".."
[lib]
name = "actix_utils"
@@ -20,8 +19,8 @@ path = "src/lib.rs"
actix-service = "1.0.0"
actix-rt = "1.0.0"
actix-codec = "0.2.0"
bytes = "0.5.2"
either = "1.5.2"
bytes = "0.5.3"
either = "1.5.3"
futures = "0.3.1"
pin-project = "0.4.6"
log = "0.4"

View File

@@ -4,12 +4,14 @@ use std::fmt;
use std::future::Future;
use std::marker::PhantomData;
use std::pin::Pin;
use std::rc::Rc;
use std::task::{Context, Poll};
use actix_service::{IntoService, Service, Transform};
use futures::future::{ok, Ready};
use crate::oneshot;
use crate::task::LocalWaker;
struct Record<I, E> {
rx: oneshot::Receiver<Result<I, E>>,
@@ -103,6 +105,7 @@ where
pub struct InOrderService<S: Service> {
service: S,
waker: Rc<LocalWaker>,
acks: VecDeque<Record<S::Response, S::Error>>,
}
@@ -120,6 +123,7 @@ where
Self {
service: service.into_service(),
acks: VecDeque::new(),
waker: Rc::new(LocalWaker::new()),
}
}
}
@@ -137,6 +141,9 @@ where
type Future = InOrderServiceResponse<S>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
// poll_ready could be called from different task
self.waker.register(cx.waker());
// check acks
while !self.acks.is_empty() {
let rec = self.acks.front_mut().unwrap();
@@ -165,9 +172,11 @@ where
let (tx2, rx2) = oneshot::channel();
self.acks.push_back(Record { rx: rx1, tx: tx2 });
let waker = self.waker.clone();
let fut = self.service.call(request);
actix_rt::spawn(async move {
let res = fut.await;
waker.wake();
let _ = tx1.send(res);
});
@@ -202,7 +211,7 @@ mod tests {
use super::*;
use actix_service::Service;
use futures::channel::oneshot;
use futures::future::{lazy, FutureExt, LocalBoxFuture};
use futures::future::{lazy, poll_fn, FutureExt, LocalBoxFuture};
struct Srv;
@@ -236,15 +245,18 @@ mod tests {
let _ = actix_rt::System::new("test").block_on(async {
let mut srv = InOrderService::new(Srv);
let _ = lazy(|cx| srv.poll_ready(cx)).await;
let res1 = srv.call(rx1);
let res2 = srv.call(rx2);
let res3 = srv.call(rx3);
let _ = lazy(|cx| srv.poll_ready(cx)).await;
// dispatcher do this
actix_rt::time::delay_for(Duration::from_millis(100)).await;
let _ = lazy(|cx| srv.poll_ready(cx)).await;
actix_rt::spawn(async move {
let _ = poll_fn(|cx| {
let _ = srv.poll_ready(cx);
Poll::<()>::Pending
})
.await;
});
assert_eq!(res1.await.unwrap(), 1);
assert_eq!(res2.await.unwrap(), 2);

View File

@@ -34,11 +34,22 @@ impl LocalWaker {
}
}
#[inline]
/// Check if waker has been registered.
pub fn is_registed(&self) -> bool {
unsafe { (*self.waker.get()).is_some() }
}
#[inline]
/// Registers the waker to be notified on calls to `wake`.
pub fn register(&self, waker: &Waker) {
///
/// Returns `true` if waker was registered before.
pub fn register(&self, waker: &Waker) -> bool {
unsafe {
*self.waker.get() = Some(waker.clone());
let w = self.waker.get();
let is_registered = (*w).is_some();
*w = Some(waker.clone());
is_registered
}
}

View File

@@ -1,9 +1,15 @@
# Changes
[0.1.1] - 2019-12-07
## [0.1.2] - 2019-12-22
* Fix `new()` method
* Make `ByteString::from_static()` and `ByteString::from_bytes_unchecked()` methods const.
## [0.1.1] - 2019-12-07
* Fix hash impl
[0.1.0] - 2019-12-07
## [0.1.0] - 2019-12-07
* Initial release

View File

@@ -1,6 +1,6 @@
[package]
name = "bytestring"
version = "0.1.1"
version = "0.1.2"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "A UTF-8 encoded string with Bytes as a storage"
keywords = ["actix"]
@@ -9,11 +9,10 @@ repository = "https://github.com/actix/actix-net.git"
documentation = "https://docs.rs/bytestring/"
license = "MIT/Apache-2.0"
edition = "2018"
workspace = ".."
[lib]
name = "bytestring"
path = "src/lib.rs"
[dependencies]
bytes = "0.5.2"
bytes = "0.5.3"

View File

@@ -6,14 +6,14 @@ use bytes::Bytes;
/// A utf-8 encoded string with [`Bytes`] as a storage.
///
/// [`Bytes`]: https://docs.rs/bytes/0.5.2/bytes/struct.Bytes.html
/// [`Bytes`]: https://docs.rs/bytes/0.5.3/bytes/struct.Bytes.html
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Default)]
pub struct ByteString(Bytes);
impl ByteString {
/// Creates a new `ByteString`.
pub fn new() -> String {
String::default()
pub fn new() -> Self {
ByteString(Bytes::new())
}
/// Get a reference to the underlying bytes object.
@@ -27,12 +27,12 @@ impl ByteString {
}
/// Creates a new `ByteString` from a static str.
pub fn from_static(src: &'static str) -> ByteString {
Self(Bytes::from_static(src.as_ref()))
pub const fn from_static(src: &'static str) -> ByteString {
Self(Bytes::from_static(src.as_bytes()))
}
/// Creates a new `ByteString` from a Bytes.
pub unsafe fn from_bytes_unchecked(src: Bytes) -> ByteString {
pub const unsafe fn from_bytes_unchecked(src: Bytes) -> ByteString {
Self(src)
}
}
@@ -147,6 +147,11 @@ mod test {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
#[test]
fn test_new() {
let _: ByteString = ByteString::new();
}
#[test]
fn test_hash() {
let mut hasher1 = DefaultHasher::default();
@@ -171,6 +176,7 @@ mod test {
#[test]
fn test_from_static_str() {
const _S: ByteString = ByteString::from_static("hello");
let _ = ByteString::from_static("str");
}