amberjs 1.17.0

JavaScript/TypeScript runtime built with Rust and V8
Documentation
// 零拷贝网络栈
// 实现基于 DMA 和内存映射的高性能网络 I/O

use memmap2::{Mmap, MmapOptions};
use std::sync::{Arc, Mutex, RwLock};
use super::{NetworkConfig, NetworkStats};
use std::time::Instant;
use std::net::{SocketAddr, TcpListener};

/// 零拷贝网络配置
#[derive(Debug, Clone)]
pub struct ZeroCopyConfig {
    pub mmap_size: usize,
    pub prefetch_threshold: usize,
    pub zero_copy_threshold: usize,
}
impl Default for ZeroCopyConfig {
    fn default() -> Self {
        Self {
            mmap_size: 1024 * 1024, // 1MB
            prefetch_threshold: 64 * 1024, // 64KB
            zero_copy_threshold: 1024, // 1KB
        }
    }
}
/// 零拷贝网络统计
#[derive(Debug, Clone)]
pub struct NetworkZeroCopyStats {
    pub mmap_operations: u64,
    pub zero_copy_sends: u64,
    pub zero_copy_receives: u64,
    pub prefetch_operations: u64,
    pub average_send_latency_ns: u64,
    pub average_receive_latency_ns: u64,
}
impl Default for NetworkZeroCopyStats {
    fn default() -> Self {
        Self {
            mmap_operations: 0,
            zero_copy_sends: 0,
            zero_copy_receives: 0,
            prefetch_operations: 0,
            average_send_latency_ns: 0,
            average_receive_latency_ns: 0,
        }
    }
}
/// 零拷贝套接字
pub struct ZeroCopySocket {
    config: NetworkConfig,
    zero_copy_config: ZeroCopyConfig,
    stats: Arc<RwLock<NetworkZeroCopyStats>>,
    mmap_pool: Arc<Mutex<Vec<Mmap>>>,
}
impl ZeroCopySocket {
    /// 创建新的零拷贝套接字
    pub fn new(config: NetworkConfig) -> Self {
        Self {
            zero_copy_config: ZeroCopyConfig::default(),
            stats: Arc::new(Mutex::new(NetworkZeroCopyStats::default())),
            mmap_pool: Arc::new(Mutex::new(Vec::new())),
            config,
        }
    }
    /// 创建零拷贝监听器
    pub async fn bind(addr: &SocketAddr) -> Result<ZeroCopyListener> {
        let listener: _ = TcpListener::bind(addr).await?;
        Ok(ZeroCopyListener {
            listener,
            config: NetworkConfig::default(),
            stats: Arc::new(Mutex::new(NetworkZeroCopyStats::default())),
        })
    }
    /// 发送数据(零拷贝)
    pub async fn send_zero_copy(&self, stream: &mut TcpStream, data: &[u8]) -> Result<usize> {
        if data.len() < self.zero_copy_config.zero_copy_threshold {
            // 小数据使用传统方式
            return stream.write(data).await;
        }
        // 使用零拷贝发送
        let start: _ = std::time::Instant::now();
        // 创建内存映射
        let mmap: _ = self.create_mmap(data.len())?;
        // 复制数据到映射内存
        unsafe {
            std::ptr::copy_nonoverlapping(
                data.as_ptr(),
                mmap.as_ptr() as *mut u8,
                data.len()
            );
        }
        // 通过套接字发送(简化实现)
        let result: _ = stream.write(data).await;
        // 更新统计
        let mut stats = self.stats.write().await;
        stats.zero_copy_sends += 1;
        stats.average_send_latency_ns = (stats.average_send_latency_ns + start.elapsed().as_nanos() as u64) / 2;
        result
    }
    /// 接收数据(零拷贝)
    pub async fn recv_zero_copy(&self, stream: &mut TcpStream, buf: &mut [u8]) -> Result<usize> {
        let start: _ = std::time::Instant::now();
        // 预分配内存映射缓冲区
        let mmap: _ = self.allocate_mmap(buf.len())?;
        // 接收数据
        let result: _ = stream.read(buf).await;
        // 更新统计
        let mut stats = self.stats.write().await;
        stats.zero_copy_receives += 1;
        stats.average_receive_latency_ns = (stats.average_receive_latency_ns + start.elapsed().as_nanos() as u64) / 2;
        result
    }
    /// 创建内存映射
    fn create_mmap(&self, size: usize) -> Result<Mmap> {
        // 创建临时文件用于内存映射
        let temp_file: _ = std::env::temp_dir().join(format!("amberjs_zero_copy_{}", std::process::id()));
        let file: _ = std::fs::OpenOptions::new()
            .read(true)
            .write(true)
            .create(true)
            .open(&temp_file)?;
        // 设置文件大小
        file.set_len(size as u64)?;
        // 创建内存映射
        unsafe {
            let mmap: _ = MmapOptions::new()
                .map(&file)?;
            Ok(mmap)
        }
    }
    /// 分配内存映射
    fn allocate_mmap(&self, size: usize) -> Result<Mmap> {
        self.create_mmap(size)
    }
    /// 获取统计信息
    pub async fn get_stats(&self) -> NetworkZeroCopyStats {
        self.stats.read().await.clone()
    }
}
/// 零拷贝监听器
pub struct ZeroCopyListener {
    listener: TcpListener,
    config: NetworkConfig,
    stats: Arc<RwLock<NetworkZeroCopyStats>>,
}
impl ZeroCopyListener {
    /// 接受新连接
    pub async fn accept(&self) -> Result<(ZeroCopyStream, SocketAddr)> {
        let (stream, addr) = self.listener.accept().await?;
        Ok((ZeroCopyStream { stream }, addr))
    }
    /// 获取统计信息
    pub async fn get_stats(&self) -> NetworkZeroCopyStats {
        self.stats.read().await.clone()
    }
}
/// 零拷贝流
pub struct ZeroCopyStream {
    stream: tokio::net::TcpStream,
}
impl ZeroCopyStream {
    /// 发送数据
    pub async fn send(&mut self, data: &[u8]) -> Result<usize> {
        self.stream.write(data).await
    }
    /// 接收数据
    pub async fn recv(&mut self, buf: &mut [u8]) -> Result<usize> {
        self.stream.read(buf).await
    }
}
impl Drop for ZeroCopySocket {
    fn drop(&mut self) {
        // 清理临时文件
        let temp_dir: _ = std::env::temp_dir();
        let temp_file: _ = temp_dir.join(format!("amberjs_zero_copy_{}", std::process::id()));
        let _: _ = std::fs::remove_file(temp_file);
    }
}