Use bytes crate for zerocopy and memory re-use (#182)
* Use bytes. Not yet zerocopy everywhere but compiles * Actually zerocopy * Actually zerocopy * Not actually storing the torrent on disk now
This commit is contained in:
parent
3cc9e444b1
commit
c7ed475f54
20 changed files with 182 additions and 95 deletions
|
|
@ -20,3 +20,4 @@ clone_to_owned = { path = "../clone_to_owned", package = "librqbit-clone-to-owne
|
|||
librqbit-core = { path = "../librqbit_core", version = "3.9.0" }
|
||||
bitvec = "1"
|
||||
anyhow = "1"
|
||||
bytes = "1.7.1"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use std::{
|
|||
use buffers::ByteBuf;
|
||||
use byteorder::ByteOrder;
|
||||
use byteorder::BE;
|
||||
use bytes::Bytes;
|
||||
use clone_to_owned::CloneToOwned;
|
||||
use serde::{Deserialize, Deserializer, Serialize};
|
||||
|
||||
|
|
@ -75,14 +76,14 @@ where
|
|||
{
|
||||
type Target = ExtendedHandshake<<ByteBuf as CloneToOwned>::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
ExtendedHandshake {
|
||||
m: self.m.clone_to_owned(),
|
||||
m: self.m.clone_to_owned(within_buffer),
|
||||
p: self.p,
|
||||
v: self.v.clone_to_owned(),
|
||||
v: self.v.clone_to_owned(within_buffer),
|
||||
yourip: self.yourip,
|
||||
ipv6: self.ipv6.clone_to_owned(),
|
||||
ipv4: self.ipv4.clone_to_owned(),
|
||||
ipv6: self.ipv6.clone_to_owned(within_buffer),
|
||||
ipv4: self.ipv4.clone_to_owned(within_buffer),
|
||||
reqq: self.reqq,
|
||||
metadata_size: self.metadata_size,
|
||||
complete_ago: self.complete_ago,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use bencode::bencode_serialize_to_writer;
|
||||
use bencode::from_bytes;
|
||||
use bencode::BencodeValue;
|
||||
use bytes::Bytes;
|
||||
use clone_to_owned::CloneToOwned;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
|
|
@ -27,11 +28,15 @@ where
|
|||
{
|
||||
type Target = ExtendedMessage<<ByteBuf as CloneToOwned>::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
match self {
|
||||
ExtendedMessage::Handshake(h) => ExtendedMessage::Handshake(h.clone_to_owned()),
|
||||
ExtendedMessage::Dyn(u, d) => ExtendedMessage::Dyn(*u, d.clone_to_owned()),
|
||||
ExtendedMessage::UtMetadata(m) => ExtendedMessage::UtMetadata(m.clone_to_owned()),
|
||||
ExtendedMessage::Handshake(h) => {
|
||||
ExtendedMessage::Handshake(h.clone_to_owned(within_buffer))
|
||||
}
|
||||
ExtendedMessage::Dyn(u, d) => ExtendedMessage::Dyn(*u, d.clone_to_owned(within_buffer)),
|
||||
ExtendedMessage::UtMetadata(m) => {
|
||||
ExtendedMessage::UtMetadata(m.clone_to_owned(within_buffer))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
use std::io::Write;
|
||||
|
||||
use bencode::bencode_serialize_to_writer;
|
||||
use bencode::BencodeDeserializer;
|
||||
use bytes::Bytes;
|
||||
use clone_to_owned::CloneToOwned;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
use std::io::Write;
|
||||
|
||||
use crate::MessageDeserializeError;
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ pub enum UtMetadata<ByteBuf> {
|
|||
impl<ByteBuf: CloneToOwned> CloneToOwned for UtMetadata<ByteBuf> {
|
||||
type Target = UtMetadata<<ByteBuf as CloneToOwned>::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
match self {
|
||||
UtMetadata::Request(req) => UtMetadata::Request(*req),
|
||||
UtMetadata::Data {
|
||||
|
|
@ -32,7 +32,7 @@ impl<ByteBuf: CloneToOwned> CloneToOwned for UtMetadata<ByteBuf> {
|
|||
} => UtMetadata::Data {
|
||||
piece: *piece,
|
||||
total_size: *total_size,
|
||||
data: data.clone_to_owned(),
|
||||
data: data.clone_to_owned(within_buffer),
|
||||
},
|
||||
UtMetadata::Reject(piece) => UtMetadata::Reject(*piece),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ pub mod extended;
|
|||
use bincode::Options;
|
||||
use buffers::{ByteBuf, ByteBufOwned};
|
||||
use byteorder::{ByteOrder, BE};
|
||||
use bytes::Bytes;
|
||||
use clone_to_owned::CloneToOwned;
|
||||
use librqbit_core::{constants::CHUNK_SIZE, hash_id::Id20, lengths::ChunkInfo};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
|
@ -84,11 +85,11 @@ pub struct Piece<B> {
|
|||
impl<B: CloneToOwned> CloneToOwned for Piece<B> {
|
||||
type Target = Piece<B::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
Piece {
|
||||
index: self.index,
|
||||
begin: self.begin,
|
||||
block: self.block.clone_to_owned(),
|
||||
block: self.block.clone_to_owned(within_buffer),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -211,23 +212,23 @@ where
|
|||
{
|
||||
type Target = Message<<ByteBuf as CloneToOwned>::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
match self {
|
||||
Message::Request(req) => Message::Request(*req),
|
||||
Message::Cancel(req) => Message::Cancel(*req),
|
||||
Message::Bitfield(b) => Message::Bitfield(b.clone_to_owned()),
|
||||
Message::Bitfield(b) => Message::Bitfield(b.clone_to_owned(within_buffer)),
|
||||
Message::Choke => Message::Choke,
|
||||
Message::Unchoke => Message::Unchoke,
|
||||
Message::Interested => Message::Interested,
|
||||
Message::Piece(piece) => Message::Piece(Piece {
|
||||
index: piece.index,
|
||||
begin: piece.begin,
|
||||
block: piece.block.clone_to_owned(),
|
||||
block: piece.block.clone_to_owned(within_buffer),
|
||||
}),
|
||||
Message::KeepAlive => Message::KeepAlive,
|
||||
Message::Have(v) => Message::Have(*v),
|
||||
Message::NotInterested => Message::NotInterested,
|
||||
Message::Extended(e) => Message::Extended(e.clone_to_owned()),
|
||||
Message::Extended(e) => Message::Extended(e.clone_to_owned(within_buffer)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -585,9 +586,9 @@ where
|
|||
{
|
||||
type Target = Handshake<<B as CloneToOwned>::Target>;
|
||||
|
||||
fn clone_to_owned(&self) -> Self::Target {
|
||||
fn clone_to_owned(&self, within_buffer: Option<&Bytes>) -> Self::Target {
|
||||
Handshake {
|
||||
pstr: self.pstr.clone_to_owned(),
|
||||
pstr: self.pstr.clone_to_owned(within_buffer),
|
||||
reserved: self.reserved,
|
||||
info_hash: self.info_hash,
|
||||
peer_id: self.peer_id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue