From 293c94e9a2786d7160130afcabcfdca92210a497 Mon Sep 17 00:00:00 2001 From: groche97 Date: Fri, 30 Sep 2022 00:16:11 +0200 Subject: [PATCH] try to optimice with splice --- Cargo.lock | 8 +++++- Cargo.toml | 2 +- src/client/guard.rs | 4 +++ src/client/mod.rs | 66 ++++++++++++++++++++++++++++++++++++++++++--- src/main.rs | 1 + 5 files changed, 76 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fef5316..39503b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "libc" +version = "0.2.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -12,7 +18,7 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" name = "minecraft_proxy" version = "0.1.0" dependencies = [ - "linked-hash-map", + "libc", "yaml-rust", ] diff --git a/Cargo.toml b/Cargo.toml index 2269d60..73f69a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ edition = "2021" [dependencies] yaml-rust = "*" -linked-hash-map = "*" \ No newline at end of file +libc = "*" \ No newline at end of file diff --git a/src/client/guard.rs b/src/client/guard.rs index a21f363..033fccd 100644 --- a/src/client/guard.rs +++ b/src/client/guard.rs @@ -19,6 +19,10 @@ impl Guard { *self.cont.read().unwrap() < MAX_THREADS } + pub fn get_connections(&self)->usize{ + *self.cont.read().unwrap() + } + pub fn add_thread(&mut self, threads: (thread::JoinHandle<()>, thread::JoinHandle<()>))-> bool { if self.can_add() { diff --git a/src/client/mod.rs b/src/client/mod.rs index e1f42f9..e220e32 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -2,6 +2,12 @@ use std::net::TcpStream; use std::io::prelude::*; use std::thread; use std::sync::{Arc, Mutex, RwLock}; +use libc::splice; +use libc::pipe; +use libc::{SPLICE_F_MORE,SPLICE_F_MOVE}; +use std::os::unix::io::AsRawFd; +use std::ptr; +use std::time::SystemTime; use crate::protocol; pub mod guard; @@ -31,9 +37,19 @@ impl<'a> Client<'a> { fn join_conexions_mutex(c1: Arc>, c2: Arc>, run: Arc>){ - let mut buf: [u8; 100000] = [0; 100000]; + let mut buf: [u8; 200] = [0; 200]; let mut client = c1.lock().unwrap().try_clone().unwrap(); + let mut len2; + let mut p: [i32;2] = [0,0]; + let tam = 200; + let mut max = 0; + let mut time; + let mut time2; + let mut fin = 0; + let mut fin2 = 0; + unsafe{len2 = pipe(p.as_ptr() as *mut i32);} while *run.read().unwrap() { + time = SystemTime::now(); let res=client.read(&mut buf); match res { Ok(leng) => { @@ -41,15 +57,59 @@ impl<'a> Client<'a> { *run.write().unwrap()=false; } match c2.lock().unwrap().write(&buf [.. leng]) { - Ok(_l) => {}, + Ok(_l) => { + time2 = SystemTime::now(); + fin2 = time2.duration_since(time).unwrap_or_default().as_micros(); + if fin2 > fin { + fin = fin2; + } + }, Err(_e) => *run.write().unwrap()=false, } }, - Err(_e) => *run.write().unwrap()=false, } } + println!("time {}", fin); + } + + fn join_conexions_kernel(c1: Arc>, + c2: Arc>, + run: Arc>){ + let mut client = c1.lock().unwrap().try_clone().unwrap(); + let mut len2; + let mut p: [i32;2] = [0,0]; + let tam = 20000; + let mut len; + let mut time; + let mut time2; + let mut fin = 0; + let mut fin2 = 0; + unsafe{len2 = pipe(p.as_ptr() as *mut i32);} + while *run.read().unwrap() { + time = SystemTime::now(); + unsafe { + len = splice(client.as_raw_fd(), ptr::null_mut(), + p[1], ptr::null_mut(), tam, SPLICE_F_MOVE); + + if len <= 0 { + *run.write().unwrap()=false; + break; + } + + splice(p[0], ptr::null_mut(), + c2.lock().unwrap().as_raw_fd(), ptr::null_mut(), + len as usize, SPLICE_F_MOVE | SPLICE_F_MORE); + time2 = SystemTime::now(); + fin2 = time2.duration_since(time).unwrap_or_default().as_micros(); + if fin2 > fin { + fin = fin2; + } + } + + } + println!("time {}",fin); } pub fn start_proxy(&self) -> (thread::JoinHandle<()>, thread::JoinHandle<()>) { diff --git a/src/main.rs b/src/main.rs index 0dede85..c27ed15 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ fn main() { let guard = Arc::new(RwLock::new(guard::Guard::new())); for stream in listener.incoming() { if guard.read().unwrap().can_add(){ + println!("g {}",guard.read().unwrap().get_connections()); match stream { Ok(stream) => { let g = guard.clone();