parent
2004e7b21f
commit
ecb55ed32a
2 changed files with 9 additions and 60 deletions
|
|
@ -3,16 +3,16 @@
|
||||||
//
|
//
|
||||||
// Not useful outside of librqbit.
|
// Not useful outside of librqbit.
|
||||||
|
|
||||||
use std::marker::PhantomData;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use serde::Deserializer;
|
|
||||||
|
|
||||||
use clone_to_owned::CloneToOwned;
|
use clone_to_owned::CloneToOwned;
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Eq, Hash, Clone, PartialOrd, Ord)]
|
#[derive(Default, Deserialize, PartialEq, Eq, Hash, Clone, PartialOrd, Ord)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct ByteBufOwned(pub Box<[u8]>);
|
pub struct ByteBufOwned(pub Box<[u8]>);
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Eq, Hash, Clone, PartialOrd, Ord)]
|
#[derive(Default, Deserialize, PartialEq, Eq, Hash, Clone, PartialOrd, Ord)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct ByteBuf<'a>(pub &'a [u8]);
|
pub struct ByteBuf<'a>(pub &'a [u8]);
|
||||||
|
|
||||||
pub trait ByteBufT {
|
pub trait ByteBufT {
|
||||||
|
|
@ -170,54 +170,3 @@ impl serde::ser::Serialize for ByteBufOwned {
|
||||||
serializer.serialize_bytes(self.as_slice())
|
serializer.serialize_bytes(self.as_slice())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> serde::de::Deserialize<'de> for ByteBufOwned {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
struct Visitor;
|
|
||||||
|
|
||||||
impl<'de> serde::de::Visitor<'de> for Visitor {
|
|
||||||
type Value = ByteBufOwned;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
||||||
formatter.write_str("byte string")
|
|
||||||
}
|
|
||||||
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: serde::de::Error,
|
|
||||||
{
|
|
||||||
Ok(ByteBufOwned::from(v.to_owned()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(deserializer.deserialize_byte_buf(Visitor {})?)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de: 'a, 'a> serde::de::Deserialize<'de> for ByteBuf<'a> {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
#[derive(Default)]
|
|
||||||
struct Visitor<'a> {
|
|
||||||
_p: PhantomData<&'a ()>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de: 'a, 'a> serde::de::Visitor<'de> for Visitor<'a> {
|
|
||||||
type Value = ByteBuf<'a>;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
||||||
formatter.write_str("byte string")
|
|
||||||
}
|
|
||||||
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: serde::de::Error,
|
|
||||||
{
|
|
||||||
Ok(ByteBuf::from(v))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(deserializer.deserialize_byte_buf(Visitor::default())?)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -248,10 +248,10 @@ impl TorrentStateLive {
|
||||||
let stats = state.stats_snapshot();
|
let stats = state.stats_snapshot();
|
||||||
let fetched = stats.fetched_bytes;
|
let fetched = stats.fetched_bytes;
|
||||||
let needed = state.initially_needed();
|
let needed = state.initially_needed();
|
||||||
// TODO: this is very coarse, as it doesn't capture partially
|
// fetched can be too high in theory, so for safety make sure that it doesn't wrap around u64.
|
||||||
// downloaded pieces. But it's better than using "fetched" which is bugged,
|
let remaining = needed
|
||||||
// see #92
|
.wrapping_sub(fetched)
|
||||||
let remaining = needed - stats.downloaded_and_checked_bytes;
|
.min(needed - stats.downloaded_and_checked_bytes);
|
||||||
state
|
state
|
||||||
.down_speed_estimator
|
.down_speed_estimator
|
||||||
.add_snapshot(fetched, Some(remaining), now);
|
.add_snapshot(fetched, Some(remaining), now);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue