Restructuring some windows files
This commit is contained in:
parent
f015f54760
commit
bdecf3a6cf
@ -3,7 +3,7 @@ use std::mem::uninitialized;
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
pub(super) struct Allocator<T> {
|
pub(crate) struct Allocator<T> {
|
||||||
map: HashMap<usize, Pin<Box<T>>>,
|
map: HashMap<usize, Pin<Box<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
123
network/windows/src/eventloop/mod.rs
Normal file
123
network/windows/src/eventloop/mod.rs
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
mod socket;
|
||||||
|
mod task;
|
||||||
|
mod allocator;
|
||||||
|
|
||||||
|
use socket::WindowsOverlappingIcmpSocket;
|
||||||
|
|
||||||
|
use crate::address::WindowsAddressKnown;
|
||||||
|
use allocator::Allocator;
|
||||||
|
use task::IoTask;
|
||||||
|
use bgtu_networks_2_network_abstract::ServersContext;
|
||||||
|
use std::mem::uninitialized;
|
||||||
|
use std::pin::Pin;
|
||||||
|
use std::ptr::NonNull;
|
||||||
|
use windows::Win32::System::IO::OVERLAPPED;
|
||||||
|
use windows::Win32::System::Threading::SleepEx;
|
||||||
|
|
||||||
|
pub unsafe fn run_eventloop<Ctx: ServersContext<WindowsAddressKnown>>(ctx: *mut Ctx) {
|
||||||
|
let mut heap = Allocator::<IoTask<CallbackData<_>>>::new();
|
||||||
|
|
||||||
|
let mut socket = WindowsOverlappingIcmpSocket::new();
|
||||||
|
|
||||||
|
let mut recv_task = NonNull::from_mut(&mut heap).as_mut().alloc();
|
||||||
|
CallbackData::init_recv(
|
||||||
|
&mut recv_task,
|
||||||
|
NonNull::new_unchecked(ctx),
|
||||||
|
NonNull::from_mut(&mut heap),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut is_receive_enabled = false;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let (id, it) = (*ctx).start_measuring();
|
||||||
|
|
||||||
|
let mut should_recv_being_enabled = false;
|
||||||
|
for address in it {
|
||||||
|
let mut task = NonNull::from_mut(&mut heap).as_mut().alloc();
|
||||||
|
CallbackData::init_send(
|
||||||
|
&mut task,
|
||||||
|
NonNull::new_unchecked(ctx),
|
||||||
|
NonNull::from_mut(&mut heap),
|
||||||
|
address,
|
||||||
|
);
|
||||||
|
|
||||||
|
socket.send(&mut task, Some(sending_done::<Ctx>));
|
||||||
|
should_recv_being_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_receive_enabled && should_recv_being_enabled) {
|
||||||
|
socket.receive(&mut recv_task, Some(receiving_done::<Ctx>));
|
||||||
|
is_receive_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SleepEx(1000, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CallbackData<Ctx: ServersContext<WindowsAddressKnown>> {
|
||||||
|
ctx: NonNull<Ctx>,
|
||||||
|
allocator: NonNull<Allocator<IoTask<Self>>>,
|
||||||
|
address: WindowsAddressKnown,
|
||||||
|
__flags: u32,
|
||||||
|
__addrs_size: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Ctx: ServersContext<WindowsAddressKnown>> CallbackData<Ctx> {
|
||||||
|
fn init_send(
|
||||||
|
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
||||||
|
ctx: NonNull<Ctx>,
|
||||||
|
allocator: NonNull<Allocator<IoTask<Self>>>,
|
||||||
|
address: WindowsAddressKnown,
|
||||||
|
) {
|
||||||
|
task.init(Self {
|
||||||
|
ctx,
|
||||||
|
allocator,
|
||||||
|
address,
|
||||||
|
__flags: unsafe { uninitialized() },
|
||||||
|
__addrs_size: unsafe { uninitialized() },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
fn init_recv(
|
||||||
|
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
||||||
|
ctx: NonNull<Ctx>,
|
||||||
|
allocator: NonNull<Allocator<IoTask<Self>>>,
|
||||||
|
) {
|
||||||
|
task.init(Self {
|
||||||
|
ctx,
|
||||||
|
allocator,
|
||||||
|
address: unsafe { uninitialized() },
|
||||||
|
__flags: unsafe { uninitialized() },
|
||||||
|
__addrs_size: unsafe { uninitialized() },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe extern "system" fn sending_done<Ctx: ServersContext<WindowsAddressKnown>>(
|
||||||
|
dwerror: u32,
|
||||||
|
cbtransferred: u32,
|
||||||
|
lpoverlapped: *mut OVERLAPPED,
|
||||||
|
dwflags: u32,
|
||||||
|
) {
|
||||||
|
let mut task = Pin::new_unchecked(
|
||||||
|
lpoverlapped
|
||||||
|
.cast::<IoTask<CallbackData<Ctx>>>()
|
||||||
|
.as_mut()
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
task.get_extra().allocator.as_mut().free(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe extern "system" fn receiving_done<Ctx: ServersContext<WindowsAddressKnown>>(
|
||||||
|
dwerror: u32,
|
||||||
|
cbtransferred: u32,
|
||||||
|
lpoverlapped: *mut OVERLAPPED,
|
||||||
|
dwflags: u32,
|
||||||
|
) {
|
||||||
|
let mut task = Pin::new_unchecked(
|
||||||
|
lpoverlapped
|
||||||
|
.cast::<IoTask<CallbackData<Ctx>>>()
|
||||||
|
.as_mut()
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
task.get_extra().allocator.as_mut().free(task);
|
||||||
|
}
|
||||||
@ -1,9 +1,8 @@
|
|||||||
use crate::address::WindowsAddressKnown;
|
use crate::address::WindowsAddressKnown;
|
||||||
use crate::allocator::Allocator;
|
|
||||||
use crate::errors::throw_from_windows_err_code;
|
use crate::errors::throw_from_windows_err_code;
|
||||||
use crate::task::IoTask;
|
use crate::eventloop::CallbackData;
|
||||||
|
use crate::eventloop::task::IoTask;
|
||||||
use bgtu_networks_2_network_abstract::ServersContext;
|
use bgtu_networks_2_network_abstract::ServersContext;
|
||||||
use std::mem::uninitialized;
|
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::ptr::NonNull;
|
use std::ptr::NonNull;
|
||||||
use windows::Win32::Networking::WinSock::{
|
use windows::Win32::Networking::WinSock::{
|
||||||
@ -15,123 +14,12 @@ use windows::Win32::Networking::WinSock::{
|
|||||||
WSAENOTSOCK, WSAESHUTDOWN, WSAEWOULDBLOCK, WSAGetLastError, WSANOTINITIALISED, WSARecvFrom,
|
WSAENOTSOCK, WSAESHUTDOWN, WSAEWOULDBLOCK, WSAGetLastError, WSANOTINITIALISED, WSARecvFrom,
|
||||||
WSASendTo, WSASocketW,
|
WSASendTo, WSASocketW,
|
||||||
};
|
};
|
||||||
use windows::Win32::System::IO::OVERLAPPED;
|
|
||||||
use windows::Win32::System::Threading::SleepEx;
|
|
||||||
|
|
||||||
pub unsafe fn run_eventloop<Ctx: ServersContext<WindowsAddressKnown>>(ctx: *mut Ctx) {
|
pub(super) struct WindowsOverlappingIcmpSocket {
|
||||||
let mut heap = Allocator::<IoTask<CallbackData<_>>>::new();
|
|
||||||
|
|
||||||
let mut socket = WindowsOverlappingIcmpSocket::new();
|
|
||||||
|
|
||||||
let mut recv_task = NonNull::from_mut(&mut heap).as_mut().alloc();
|
|
||||||
CallbackData::init_recv(
|
|
||||||
&mut recv_task,
|
|
||||||
NonNull::new_unchecked(ctx),
|
|
||||||
NonNull::from_mut(&mut heap),
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut is_receive_enabled = false;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
let (id, it) = (*ctx).start_measuring();
|
|
||||||
|
|
||||||
let mut should_recv_being_enabled = false;
|
|
||||||
for address in it {
|
|
||||||
let mut task = NonNull::from_mut(&mut heap).as_mut().alloc();
|
|
||||||
CallbackData::init_send(
|
|
||||||
&mut task,
|
|
||||||
NonNull::new_unchecked(ctx),
|
|
||||||
NonNull::from_mut(&mut heap),
|
|
||||||
address,
|
|
||||||
);
|
|
||||||
|
|
||||||
socket.send(&mut task, Some(sending_done::<Ctx>));
|
|
||||||
should_recv_being_enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_receive_enabled && should_recv_being_enabled) {
|
|
||||||
socket.receive(&mut recv_task, Some(receiving_done::<Ctx>));
|
|
||||||
is_receive_enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SleepEx(1000, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CallbackData<Ctx: ServersContext<WindowsAddressKnown>> {
|
|
||||||
ctx: NonNull<Ctx>,
|
|
||||||
allocator: NonNull<Allocator<IoTask<Self>>>,
|
|
||||||
address: WindowsAddressKnown,
|
|
||||||
__flags: u32,
|
|
||||||
__addrs_size: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Ctx: ServersContext<WindowsAddressKnown>> CallbackData<Ctx> {
|
|
||||||
fn init_send(
|
|
||||||
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
|
||||||
ctx: NonNull<Ctx>,
|
|
||||||
allocator: NonNull<Allocator<IoTask<Self>>>,
|
|
||||||
address: WindowsAddressKnown,
|
|
||||||
) {
|
|
||||||
task.init(Self {
|
|
||||||
ctx,
|
|
||||||
allocator,
|
|
||||||
address,
|
|
||||||
__flags: unsafe { uninitialized() },
|
|
||||||
__addrs_size: unsafe { uninitialized() },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
fn init_recv(
|
|
||||||
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
|
||||||
ctx: NonNull<Ctx>,
|
|
||||||
allocator: NonNull<Allocator<IoTask<Self>>>,
|
|
||||||
) {
|
|
||||||
task.init(Self {
|
|
||||||
ctx,
|
|
||||||
allocator,
|
|
||||||
address: unsafe { uninitialized() },
|
|
||||||
__flags: unsafe { uninitialized() },
|
|
||||||
__addrs_size: unsafe { uninitialized() },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe extern "system" fn sending_done<Ctx: ServersContext<WindowsAddressKnown>>(
|
|
||||||
dwerror: u32,
|
|
||||||
cbtransferred: u32,
|
|
||||||
lpoverlapped: *mut OVERLAPPED,
|
|
||||||
dwflags: u32,
|
|
||||||
) {
|
|
||||||
let mut task = Pin::new_unchecked(
|
|
||||||
lpoverlapped
|
|
||||||
.cast::<IoTask<CallbackData<Ctx>>>()
|
|
||||||
.as_mut()
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
task.get_extra().allocator.as_mut().free(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe extern "system" fn receiving_done<Ctx: ServersContext<WindowsAddressKnown>>(
|
|
||||||
dwerror: u32,
|
|
||||||
cbtransferred: u32,
|
|
||||||
lpoverlapped: *mut OVERLAPPED,
|
|
||||||
dwflags: u32,
|
|
||||||
) {
|
|
||||||
let mut task = Pin::new_unchecked(
|
|
||||||
lpoverlapped
|
|
||||||
.cast::<IoTask<CallbackData<Ctx>>>()
|
|
||||||
.as_mut()
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
task.get_extra().allocator.as_mut().free(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct WindowsOverlappingIcmpSocket {
|
|
||||||
s: SOCKET,
|
s: SOCKET,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowsOverlappingIcmpSocket {
|
impl WindowsOverlappingIcmpSocket {
|
||||||
fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let result = unsafe {
|
let result = unsafe {
|
||||||
WSASocketW(
|
WSASocketW(
|
||||||
AF_UNSPEC.0 as i32,
|
AF_UNSPEC.0 as i32,
|
||||||
@ -149,7 +37,7 @@ impl WindowsOverlappingIcmpSocket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn send<Ctx: ServersContext<WindowsAddressKnown>>(
|
pub unsafe fn send<Ctx: ServersContext<WindowsAddressKnown>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
||||||
cb: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
cb: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
||||||
@ -200,7 +88,7 @@ impl WindowsOverlappingIcmpSocket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn receive<Ctx: ServersContext<WindowsAddressKnown>>(
|
pub unsafe fn receive<Ctx: ServersContext<WindowsAddressKnown>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
task: &mut Pin<&mut IoTask<CallbackData<Ctx>>>,
|
||||||
cb: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
cb: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
|
||||||
@ -1,8 +1,6 @@
|
|||||||
mod address;
|
mod address;
|
||||||
mod errors;
|
mod errors;
|
||||||
mod task;
|
|
||||||
mod eventloop;
|
mod eventloop;
|
||||||
mod allocator;
|
|
||||||
mod entry_point;
|
mod entry_point;
|
||||||
mod network_context;
|
mod network_context;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user