forked from lx/netapp
Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
448709c1db |
4 changed files with 16 additions and 15 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -311,7 +311,8 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kuska-handshake"
|
name = "kuska-handshake"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "git+https://github.com/Alexis211/handshake?branch=tokio1.0#a99e5a9c8591c41c99ce0bdfe18d596e3933bc4e"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e33da4b69f23c2ece0b3e729d079cebdc2c0206e493e42f510f500ad81c631d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"hex",
|
"hex",
|
||||||
|
|
|
@ -39,7 +39,7 @@ bytes = "0.6.0"
|
||||||
lru = { version = "0.6", optional = true }
|
lru = { version = "0.6", optional = true }
|
||||||
|
|
||||||
sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
|
sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
|
||||||
kuska-handshake = { version = "0.2.0", git = "https://github.com/Alexis211/handshake", branch = "tokio1.0", features = ["default", "async_std"] }
|
kuska-handshake = { version = "0.2.0", features = ["default", "async_std"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
structopt = { version = "0.3", default-features = false }
|
structopt = { version = "0.3", default-features = false }
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
//! about message priorization.
|
//! about message priorization.
|
||||||
//! Also check out the examples to learn how to use this crate.
|
//! Also check out the examples to learn how to use this crate.
|
||||||
|
|
||||||
#![feature(map_first_last)]
|
|
||||||
|
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
|
24
src/proto.rs
24
src/proto.rs
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::{BTreeMap, HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use log::trace;
|
use log::trace;
|
||||||
|
@ -50,31 +50,33 @@ struct SendQueueItem {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SendQueue {
|
struct SendQueue {
|
||||||
items: BTreeMap<u8, VecDeque<SendQueueItem>>,
|
items: VecDeque<(u8, VecDeque<SendQueueItem>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SendQueue {
|
impl SendQueue {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
items: BTreeMap::new(),
|
items: VecDeque::with_capacity(64),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn push(&mut self, item: SendQueueItem) {
|
fn push(&mut self, item: SendQueueItem) {
|
||||||
let prio = item.prio;
|
let prio = item.prio;
|
||||||
let mut items_at_prio = self
|
let pos_prio = match self.items.binary_search_by(|(p, _)| p.cmp(&prio)) {
|
||||||
.items
|
Ok(i) => i,
|
||||||
.remove(&prio)
|
Err(i) => {
|
||||||
.unwrap_or_else(|| VecDeque::with_capacity(4));
|
self.items.insert(i, (prio, VecDeque::new()));
|
||||||
items_at_prio.push_back(item);
|
i
|
||||||
self.items.insert(prio, items_at_prio);
|
}
|
||||||
|
};
|
||||||
|
self.items[pos_prio].1.push_back(item);
|
||||||
}
|
}
|
||||||
fn pop(&mut self) -> Option<SendQueueItem> {
|
fn pop(&mut self) -> Option<SendQueueItem> {
|
||||||
match self.items.pop_first() {
|
match self.items.pop_front() {
|
||||||
None => None,
|
None => None,
|
||||||
Some((prio, mut items_at_prio)) => {
|
Some((prio, mut items_at_prio)) => {
|
||||||
let ret = items_at_prio.pop_front();
|
let ret = items_at_prio.pop_front();
|
||||||
if !items_at_prio.is_empty() {
|
if !items_at_prio.is_empty() {
|
||||||
self.items.insert(prio, items_at_prio);
|
self.items.push_front((prio, items_at_prio));
|
||||||
}
|
}
|
||||||
ret.or_else(|| self.pop())
|
ret.or_else(|| self.pop())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue