From 2e85cb118de89731678a71658d6907fc3a35a67b Mon Sep 17 00:00:00 2001 From: b-runz Date: Mon, 9 Feb 2026 13:51:22 +0100 Subject: [PATCH 1/3] Made use of portable atomic, for 32 bit portability. Fixed ipv4 option not respected in all services --- Cargo.toml | 5 ++++- crates/dht/Cargo.toml | 1 + crates/dht/src/dht.rs | 15 +++++++++----- crates/dht/src/peer_store.rs | 10 ++++++---- crates/dht/src/persistence.rs | 7 ++++++- crates/librqbit/Cargo.toml | 1 + crates/librqbit/src/file_ops.rs | 3 ++- crates/librqbit/src/limits.rs | 8 ++++---- crates/librqbit/src/session.rs | 20 +++++++++++++++---- crates/librqbit/src/stat_gen.rs | 8 ++++---- .../src/torrent_state/initializing.rs | 9 +++++++-- crates/librqbit/src/torrent_state/live/mod.rs | 7 ++++++- .../src/torrent_state/live/peers/stats/mod.rs | 2 +- .../librqbit/src/torrent_state/streaming.rs | 3 ++- crates/librqbit/src/torrent_state/utils.rs | 3 ++- .../webui/src/components/compact/PeersTab.tsx | 2 +- crates/librqbit_core/Cargo.toml | 1 + crates/librqbit_core/src/speed_estimator.rs | 4 +++- crates/librqbit_lsd/Cargo.toml | 1 + crates/librqbit_lsd/src/lib.rs | 13 +++++++++--- crates/tracker_comms/src/tracker_comms_udp.rs | 7 ++++++- crates/upnp-serve/Cargo.toml | 1 + crates/upnp-serve/src/state.rs | 4 +++- 23 files changed, 98 insertions(+), 37 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2426a75d2..c3880f24b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "crates/upnp", "crates/tracker_comms", "crates/upnp-serve", + "crates/librqbit-utp", "desktop/src-tauri", ] @@ -31,6 +32,7 @@ default-members = [ "crates/upnp", "crates/tracker_comms", "crates/upnp-serve", + "crates/librqbit-utp", ] [profile.dev] @@ -108,7 +110,7 @@ itertools = "0.14" leaky-bucket = "1.1" libc = "0.2" librqbit-dualstack-sockets = "0.6" -librqbit-utp = "0.6" +librqbit-utp = { path = "crates/librqbit-utp", version = "0.7.0" } lru = "0.16" memchr = "2" memmap2 = "0.9" @@ -119,6 +121,7 @@ nix = "0.30" notify = "8" openssl = "0.10" parking_lot = "0.12" +portable-atomic = "1.6" parse_duration = "2" pollster = "0.4" quick-xml = "0.38" diff --git a/crates/dht/Cargo.toml b/crates/dht/Cargo.toml index c1f733b94..26b267912 100644 --- a/crates/dht/Cargo.toml +++ b/crates/dht/Cargo.toml @@ -28,6 +28,7 @@ dashmap = { workspace = true, features = ["serde"] } clone_to_owned.workspace = true librqbit-core.workspace = true chrono = { workspace = true, features = ["serde"] } +portable-atomic.workspace = true tokio-util.workspace = true bytes.workspace = true librqbit-dualstack-sockets.workspace = true diff --git a/crates/dht/src/dht.rs b/crates/dht/src/dht.rs index c2defd32c..1865a786f 100644 --- a/crates/dht/src/dht.rs +++ b/crates/dht/src/dht.rs @@ -1,6 +1,6 @@ use std::{ cmp::Reverse, - net::{Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, + net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, str::FromStr, sync::{ Arc, @@ -1283,6 +1283,7 @@ pub struct DhtConfig<'a> { pub peer_store: Option, pub cancellation_token: Option, pub bind_device: Option<&'a BindDevice>, + pub ipv4_only: bool, } impl DhtState { @@ -1296,13 +1297,17 @@ impl DhtState { #[inline(never)] pub fn with_config<'a>(mut config: DhtConfig<'a>) -> BoxFuture<'a, crate::Result>> { async move { - let addr = config - .listen_addr - .unwrap_or((Ipv6Addr::UNSPECIFIED, 0).into()); + let addr = config.listen_addr.unwrap_or_else(|| { + if config.ipv4_only { + (Ipv4Addr::UNSPECIFIED, 0).into() + } else { + (Ipv6Addr::UNSPECIFIED, 0).into() + } + }); let socket = UdpSocket::bind_udp( addr, librqbit_dualstack_sockets::BindOpts { - request_dualstack: true, + request_dualstack: !config.ipv4_only, reuseport: false, device: config.bind_device, }, diff --git a/crates/dht/src/peer_store.rs b/crates/dht/src/peer_store.rs index be8b14e10..01a0aecf7 100644 --- a/crates/dht/src/peer_store.rs +++ b/crates/dht/src/peer_store.rs @@ -1,4 +1,6 @@ -use std::{collections::VecDeque, net::SocketAddr, str::FromStr, sync::atomic::AtomicU32}; +use std::{collections::VecDeque, net::SocketAddr, str::FromStr}; + +use portable_atomic::{AtomicU32, Ordering}; use bencode::ByteBufOwned; use chrono::{DateTime, Utc}; @@ -68,7 +70,7 @@ impl Serialize for PeerStore { s.serialize_field("peers", &SerializePeers { peers: &self.peers })?; s.serialize_field( "peers_len", - &self.peers_len.load(std::sync::atomic::Ordering::SeqCst), + &self.peers_len.load(Ordering::SeqCst), )?; s.end() } @@ -151,7 +153,7 @@ impl PeerStore { use dashmap::mapref::entry::Entry; let peers_entry = self.peers.entry(announce.info_hash); - let peers_len = self.peers_len.load(std::sync::atomic::Ordering::SeqCst); + let peers_len = self.peers_len.load(Ordering::SeqCst); match peers_entry { Entry::Occupied(mut occ) => { if let Some(s) = occ.get_mut().iter_mut().find(|s| s.addr == addr) { @@ -180,7 +182,7 @@ impl PeerStore { } self.peers_len - .fetch_add(1, std::sync::atomic::Ordering::SeqCst); + .fetch_add(1, Ordering::SeqCst); true } diff --git a/crates/dht/src/persistence.rs b/crates/dht/src/persistence.rs index 6329e87d2..c4e10af74 100644 --- a/crates/dht/src/persistence.rs +++ b/crates/dht/src/persistence.rs @@ -154,7 +154,11 @@ impl PersistentDht { if let Some(ref mut addr) = listen_addr { addr.set_port(port); } else { - listen_addr = Some(SocketAddr::from((Ipv6Addr::UNSPECIFIED, port))); + listen_addr = Some(if config.ipv4_only { + SocketAddr::from((Ipv4Addr::UNSPECIFIED, port)) + } else { + SocketAddr::from((Ipv6Addr::UNSPECIFIED, port)) + }); } } let peer_id = routing_table.as_ref().map(|r| r.id()); @@ -166,6 +170,7 @@ impl PersistentDht { peer_store, cancellation_token, bind_device, + ipv4_only: config.ipv4_only, ..Default::default() }; let dht = DhtState::with_config(dht_config).await?; diff --git a/crates/librqbit/Cargo.toml b/crates/librqbit/Cargo.toml index 71c1dd6ca..a7859a309 100644 --- a/crates/librqbit/Cargo.toml +++ b/crates/librqbit/Cargo.toml @@ -99,6 +99,7 @@ lru = { workspace = true, optional = true } mime_guess.workspace = true tokio-socks.workspace = true async-trait.workspace = true +portable-atomic.workspace = true async-backtrace = { workspace = true, optional = true } notify = { workspace = true, optional = true } walkdir.workspace = true diff --git a/crates/librqbit/src/file_ops.rs b/crates/librqbit/src/file_ops.rs index 93ed758d7..da108d736 100644 --- a/crates/librqbit/src/file_ops.rs +++ b/crates/librqbit/src/file_ops.rs @@ -1,8 +1,9 @@ use std::{ marker::PhantomData, - sync::atomic::{AtomicU64, Ordering}, + sync::atomic::Ordering, }; +use portable_atomic::AtomicU64; use anyhow::Context; use buffers::{ByteBuf, ByteBufOwned}; use librqbit_core::{ diff --git a/crates/librqbit/src/limits.rs b/crates/librqbit/src/limits.rs index b347214cc..8a3a8d50f 100644 --- a/crates/librqbit/src/limits.rs +++ b/crates/librqbit/src/limits.rs @@ -14,7 +14,7 @@ pub struct LimitsConfig { struct Limit { limiter: ArcSwapOption, - current_bps: std::sync::atomic::AtomicU32, + current_bps: portable_atomic::AtomicU32, } impl Limit { @@ -24,7 +24,7 @@ impl Limit { } fn new(bps: Option) -> Self { - use std::sync::atomic::AtomicU32; + use portable_atomic::AtomicU32; Self { limiter: ArcSwapOption::new(Self::new_inner(bps)), current_bps: AtomicU32::new(bps.map(|v| v.get()).unwrap_or(0)), @@ -40,7 +40,7 @@ impl Limit { } fn set(&self, limit: Option) { - use std::sync::atomic::Ordering; + use portable_atomic::Ordering; let new = Self::new_inner(limit); self.limiter.swap(new); self.current_bps @@ -48,7 +48,7 @@ impl Limit { } fn get(&self) -> Option { - use std::sync::atomic::Ordering; + use portable_atomic::Ordering; NonZeroU32::new(self.current_bps.load(Ordering::Relaxed)) } } diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 8e7d503fb..958506d90 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -6,11 +6,16 @@ use std::{ path::{Component, Path, PathBuf}, sync::{ Arc, - atomic::{AtomicUsize, Ordering}, + atomic::Ordering, }, time::Duration, }; +#[cfg(target_pointer_width = "64")] +use std::sync::atomic::AtomicUsize; +#[cfg(target_pointer_width = "32")] +use portable_atomic::AtomicUsize; + use crate::{ ApiError, CreateTorrentOptions, FileInfos, ManagedTorrent, ManagedTorrentShared, api::TorrentIdOrHash, @@ -555,12 +560,14 @@ impl Session { bootstrap_addrs: opts.dht_bootstrap_addrs.clone(), cancellation_token: Some(token.child_token()), bind_device: bind_device.as_ref(), + ipv4_only: opts.ipv4_only, ..Default::default() }) .await .context("error initializing DHT")? } else { - let pdht_config = opts.dht_config.take().unwrap_or_default(); + let mut pdht_config = opts.dht_config.take().unwrap_or_default(); + pdht_config.ipv4_only = opts.ipv4_only; PersistentDht::create( Some(pdht_config), Some(token.clone()), @@ -691,7 +698,11 @@ impl Session { None }; - let udp_tracker_client = UdpTrackerClient::new(token.clone(), bind_device.as_ref()) + let udp_tracker_client = UdpTrackerClient::new( + token.clone(), + bind_device.as_ref(), + opts.ipv4_only + ) .await .context("error creating UDP tracker client")?; @@ -702,6 +713,7 @@ impl Session { LocalServiceDiscovery::new(LocalServiceDiscoveryOptions { cancel_token: token.clone(), bind_device: bind_device.as_ref(), + ipv4_only: opts.ipv4_only, ..Default::default() }) .await @@ -1236,7 +1248,7 @@ impl Session { p.next_id().await? } else { self.next_id - .fetch_add(1, std::sync::atomic::Ordering::Relaxed) + .fetch_add(1, Ordering::Relaxed) }; let _permit = self.spawner.semaphore().acquire_owned().await?; diff --git a/crates/librqbit/src/stat_gen.rs b/crates/librqbit/src/stat_gen.rs index 8784f6949..cd6e4b268 100644 --- a/crates/librqbit/src/stat_gen.rs +++ b/crates/librqbit/src/stat_gen.rs @@ -1,9 +1,9 @@ macro_rules! stype { (atomic u32) => { - std::sync::atomic::AtomicU32 + portable_atomic::AtomicU32 }; (atomic u64) => { - std::sync::atomic::AtomicU64 + portable_atomic::AtomicU64 }; (u32) => { u32 @@ -30,7 +30,7 @@ macro_rules! gen_stats { pub fn snapshot(&self) -> $snapshot_name { $snapshot_name { $( - $stat_name: self.$stat_name.load(std::sync::atomic::Ordering::Relaxed), + $stat_name: self.$stat_name.load(portable_atomic::Ordering::Relaxed), )* $( @@ -42,7 +42,7 @@ macro_rules! gen_stats { $( #[allow(unused)] pub fn $stat_name(&self, value: $stat_ty) { - self.$stat_name.fetch_add(value, std::sync::atomic::Ordering::Relaxed); + self.$stat_name.fetch_add(value, portable_atomic::Ordering::Relaxed); } )* } diff --git a/crates/librqbit/src/torrent_state/initializing.rs b/crates/librqbit/src/torrent_state/initializing.rs index b5b7e99b0..ae937119e 100644 --- a/crates/librqbit/src/torrent_state/initializing.rs +++ b/crates/librqbit/src/torrent_state/initializing.rs @@ -1,11 +1,16 @@ use std::{ sync::{ Arc, - atomic::{AtomicU64, Ordering}, + atomic::Ordering, }, time::Instant, }; +#[cfg(target_pointer_width = "64")] +use std::sync::atomic::AtomicU64; +#[cfg(target_pointer_width = "32")] +use portable_atomic::AtomicU64; + use anyhow::Context; use itertools::Itertools; @@ -53,7 +58,7 @@ impl TorrentStateInitializing { pub fn get_checked_bytes(&self) -> u64 { self.checked_bytes - .load(std::sync::atomic::Ordering::Relaxed) + .load(Ordering::Relaxed) } async fn validate_fastresume( diff --git a/crates/librqbit/src/torrent_state/live/mod.rs b/crates/librqbit/src/torrent_state/live/mod.rs index d50ff8ca4..8ecebe4c8 100644 --- a/crates/librqbit/src/torrent_state/live/mod.rs +++ b/crates/librqbit/src/torrent_state/live/mod.rs @@ -50,11 +50,16 @@ use std::{ num::NonZeroU32, sync::{ Arc, - atomic::{AtomicBool, AtomicU64, Ordering}, + atomic::{AtomicBool, Ordering}, }, time::{Duration, Instant}, }; +#[cfg(target_pointer_width = "64")] +use std::sync::atomic::AtomicU64; +#[cfg(target_pointer_width = "32")] +use portable_atomic::AtomicU64; + use anyhow::{Context, bail}; use buffers::{ByteBuf, ByteBufOwned}; use clone_to_owned::CloneToOwned; diff --git a/crates/librqbit/src/torrent_state/live/peers/stats/mod.rs b/crates/librqbit/src/torrent_state/live/peers/stats/mod.rs index de83b2988..83704b0cd 100644 --- a/crates/librqbit/src/torrent_state/live/peers/stats/mod.rs +++ b/crates/librqbit/src/torrent_state/live/peers/stats/mod.rs @@ -1,4 +1,4 @@ -use std::sync::atomic::AtomicU32; +use portable_atomic::AtomicU32; use crate::{ stream_connect::ConnectionKind, diff --git a/crates/librqbit/src/torrent_state/streaming.rs b/crates/librqbit/src/torrent_state/streaming.rs index 3615ed1bf..e8234463d 100644 --- a/crates/librqbit/src/torrent_state/streaming.rs +++ b/crates/librqbit/src/torrent_state/streaming.rs @@ -3,7 +3,7 @@ use std::{ io::SeekFrom, sync::{ Arc, - atomic::{AtomicUsize, Ordering}, + atomic::Ordering, }, task::{Poll, Waker}, time::Instant, @@ -19,6 +19,7 @@ use tokio::{ }; use tracing::{debug, trace}; +use portable_atomic::AtomicUsize; use crate::{ManagedTorrent, file_info::FileInfo, storage::TorrentStorage}; use super::{ManagedTorrentHandle, TorrentMetadata}; diff --git a/crates/librqbit/src/torrent_state/utils.rs b/crates/librqbit/src/torrent_state/utils.rs index 3acd71f01..d17c245b1 100644 --- a/crates/librqbit/src/torrent_state/utils.rs +++ b/crates/librqbit/src/torrent_state/utils.rs @@ -1,4 +1,5 @@ -use std::sync::atomic::{AtomicU32, Ordering}; +use std::sync::atomic::Ordering; +use portable_atomic::AtomicU32; pub fn atomic_inc(c: &AtomicU32) -> u32 { c.fetch_add(1, Ordering::Relaxed) diff --git a/crates/librqbit/webui/src/components/compact/PeersTab.tsx b/crates/librqbit/webui/src/components/compact/PeersTab.tsx index 65cbd917d..2300960a9 100644 --- a/crates/librqbit/webui/src/components/compact/PeersTab.tsx +++ b/crates/librqbit/webui/src/components/compact/PeersTab.tsx @@ -65,7 +65,7 @@ export const PeersTab: React.FC = ({ torrent }) => { // Fetch peer stats periodically useEffect(() => { - if (torrentId == null || !statsResponse?.live) return; + if (!torrentId || !statsResponse?.live) return; return customSetInterval(() => { return API.getPeerStats(torrentId).then( diff --git a/crates/librqbit_core/Cargo.toml b/crates/librqbit_core/Cargo.toml index af7912893..6fdcf3103 100644 --- a/crates/librqbit_core/Cargo.toml +++ b/crates/librqbit_core/Cargo.toml @@ -28,6 +28,7 @@ buffers.workspace = true bencode.workspace = true clone_to_owned.workspace = true sha1w = { workspace = true, optional = true } +portable-atomic.workspace = true itertools.workspace = true directories.workspace = true tokio-util.workspace = true diff --git a/crates/librqbit_core/src/speed_estimator.rs b/crates/librqbit_core/src/speed_estimator.rs index 953d3b127..6ca99fd19 100644 --- a/crates/librqbit_core/src/speed_estimator.rs +++ b/crates/librqbit_core/src/speed_estimator.rs @@ -1,9 +1,11 @@ use std::{ collections::VecDeque, - sync::atomic::{AtomicU64, Ordering}, + sync::atomic::Ordering, time::{Duration, Instant}, }; +use portable_atomic::AtomicU64; + use parking_lot::Mutex; #[derive(Clone, Copy)] diff --git a/crates/librqbit_lsd/Cargo.toml b/crates/librqbit_lsd/Cargo.toml index 407cba60d..1f54a9acf 100644 --- a/crates/librqbit_lsd/Cargo.toml +++ b/crates/librqbit_lsd/Cargo.toml @@ -17,6 +17,7 @@ parking_lot.workspace = true httparse.workspace = true atoi.workspace = true tracing.workspace = true +portable-atomic.workspace = true [dev-dependencies] tracing-subscriber.workspace = true diff --git a/crates/librqbit_lsd/src/lib.rs b/crates/librqbit_lsd/src/lib.rs index d66583a1b..36e362b28 100644 --- a/crates/librqbit_lsd/src/lib.rs +++ b/crates/librqbit_lsd/src/lib.rs @@ -1,14 +1,15 @@ use std::{ collections::HashMap, - net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, str::{FromStr, from_utf8}, sync::{ Arc, - atomic::{AtomicU64, Ordering}, + atomic::Ordering, }, time::{Duration, SystemTime}, }; +use portable_atomic::AtomicU64; use anyhow::Context; use futures::Stream; use librqbit_core::{Id20, spawn_utils::spawn_with_cancel}; @@ -79,12 +80,18 @@ pub struct LocalServiceDiscoveryOptions<'a> { pub cancel_token: CancellationToken, pub cookie: Option, pub bind_device: Option<&'a BindDevice>, + pub ipv4_only: bool, } impl LocalServiceDiscovery { pub async fn new(opts: LocalServiceDiscoveryOptions<'_>) -> anyhow::Result { + let bind_addr = if opts.ipv4_only { + SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), LSD_PORT) + } else { + SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), LSD_PORT) + }; let socket = MulticastUdpSocket::new( - (Ipv6Addr::UNSPECIFIED, LSD_PORT).into(), + bind_addr, LSD_IPV4, LSD_IPV6, None, diff --git a/crates/tracker_comms/src/tracker_comms_udp.rs b/crates/tracker_comms/src/tracker_comms_udp.rs index 2a3d935c2..12d6b6815 100644 --- a/crates/tracker_comms/src/tracker_comms_udp.rs +++ b/crates/tracker_comms/src/tracker_comms_udp.rs @@ -268,8 +268,13 @@ impl UdpTrackerClient { pub async fn new( cancel_token: CancellationToken, bind_device: Option<&BindDevice>, + ipv4_only: bool, ) -> anyhow::Result { - let addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0); + let addr = if ipv4_only { + SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 0) + } else { + SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0) + }; let sock = UdpSocket::bind_udp( addr, librqbit_dualstack_sockets::BindOpts { diff --git a/crates/upnp-serve/Cargo.toml b/crates/upnp-serve/Cargo.toml index 0373fa455..6657134c0 100644 --- a/crates/upnp-serve/Cargo.toml +++ b/crates/upnp-serve/Cargo.toml @@ -23,6 +23,7 @@ librqbit-upnp.workspace = true gethostname.workspace = true librqbit-core.workspace = true mime_guess.workspace = true +portable-atomic.workspace = true url.workspace = true parking_lot.workspace = true tokio-util.workspace = true diff --git a/crates/upnp-serve/src/state.rs b/crates/upnp-serve/src/state.rs index 9b2840086..a0dfa8687 100644 --- a/crates/upnp-serve/src/state.rs +++ b/crates/upnp-serve/src/state.rs @@ -1,11 +1,13 @@ use std::{ sync::{ Arc, - atomic::{AtomicU64, Ordering}, + atomic::Ordering, }, time::{Duration, SystemTime, UNIX_EPOCH}, }; +use portable_atomic::AtomicU64; + use anyhow::Context; use axum::body::Bytes; use librqbit_core::spawn_utils::spawn_with_cancel; From 00781b04c5266a293bfb7bbfef19654a43baa2c4 Mon Sep 17 00:00:00 2001 From: b-runz Date: Fri, 13 Feb 2026 09:51:06 +0100 Subject: [PATCH 2/3] Introduced more atomic 32 supoprt fixes --- crates/librqbit/src/torrent_state/live/peer/stats/atomic.rs | 3 ++- crates/librqbit/src/torrent_state/live/stats/atomic.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/librqbit/src/torrent_state/live/peer/stats/atomic.rs b/crates/librqbit/src/torrent_state/live/peer/stats/atomic.rs index c1b6c9acf..8b998b799 100644 --- a/crates/librqbit/src/torrent_state/live/peer/stats/atomic.rs +++ b/crates/librqbit/src/torrent_state/live/peer/stats/atomic.rs @@ -1,11 +1,12 @@ use std::{ sync::{ Arc, - atomic::{AtomicU32, AtomicU64, Ordering}, + atomic::Ordering, }, time::Duration, }; +use portable_atomic::{AtomicU32, AtomicU64}; use backon::{BackoffBuilder, ExponentialBackoff, ExponentialBuilder}; #[derive(Default, Debug)] diff --git a/crates/librqbit/src/torrent_state/live/stats/atomic.rs b/crates/librqbit/src/torrent_state/live/stats/atomic.rs index c16ed5085..3342585e7 100644 --- a/crates/librqbit/src/torrent_state/live/stats/atomic.rs +++ b/crates/librqbit/src/torrent_state/live/stats/atomic.rs @@ -1,4 +1,4 @@ -use std::sync::atomic::AtomicU64; +use portable_atomic::AtomicU64; #[derive(Default, Debug)] pub struct AtomicStats { From 5b5fae0e9adb2371a453856def07758fe93e2f14 Mon Sep 17 00:00:00 2001 From: b-runz Date: Fri, 13 Feb 2026 09:53:46 +0100 Subject: [PATCH 3/3] Cleaned up toml --- Cargo.toml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c3880f24b..d62ae5ab1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,6 @@ members = [ "crates/upnp", "crates/tracker_comms", "crates/upnp-serve", - "crates/librqbit-utp", "desktop/src-tauri", ] @@ -32,7 +31,6 @@ default-members = [ "crates/upnp", "crates/tracker_comms", "crates/upnp-serve", - "crates/librqbit-utp", ] [profile.dev] @@ -110,7 +108,7 @@ itertools = "0.14" leaky-bucket = "1.1" libc = "0.2" librqbit-dualstack-sockets = "0.6" -librqbit-utp = { path = "crates/librqbit-utp", version = "0.7.0" } +librqbit-utp = "0.6.4" lru = "0.16" memchr = "2" memmap2 = "0.9" @@ -121,7 +119,6 @@ nix = "0.30" notify = "8" openssl = "0.10" parking_lot = "0.12" -portable-atomic = "1.6" parse_duration = "2" pollster = "0.4" quick-xml = "0.38" @@ -155,4 +152,4 @@ url = { version = "2", default-features = false } urlencoding = "2" uuid = "1" walkdir = "2" -windows = "0.62" +windows = "0.62" \ No newline at end of file