fix macOS build

This commit is contained in:
asrael 2026-01-31 11:22:47 -06:00
parent 359657e174
commit 0c0aa792c1
No known key found for this signature in database
GPG key ID: 2786557804DFAE24
5 changed files with 107 additions and 9 deletions

View file

@ -50,6 +50,7 @@ fn main() {
.blocklist_item("FP_ZERO")
.blocklist_item("FP_SUBNORMAL")
.blocklist_item("FP_NORMAL")
.clang_arg("-DPXL8_NO_SIMD")
.use_core()
.rustified_enum(".*")
.generate()

View file

@ -2,7 +2,7 @@ use core::alloc::{GlobalAlloc, Layout};
pub struct Allocator;
#[cfg(unix)]
#[cfg(all(unix, not(target_os = "macos")))]
unsafe impl GlobalAlloc for Allocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
unsafe { libc::memalign(layout.align(), layout.size()) as *mut u8 }
@ -17,6 +17,28 @@ unsafe impl GlobalAlloc for Allocator {
}
}
#[cfg(target_os = "macos")]
unsafe impl GlobalAlloc for Allocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut ptr: *mut libc::c_void = core::ptr::null_mut();
let align = layout.align().max(8);
let size = layout.size();
let result = unsafe { libc::posix_memalign(&mut ptr, align, size) };
if result != 0 {
return core::ptr::null_mut();
}
ptr as *mut u8
}
unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
unsafe { libc::free(ptr as *mut libc::c_void) }
}
unsafe fn realloc(&self, ptr: *mut u8, _layout: Layout, new_size: usize) -> *mut u8 {
unsafe { libc::realloc(ptr as *mut libc::c_void, new_size) as *mut u8 }
}
}
#[cfg(windows)]
unsafe impl GlobalAlloc for Allocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {

View file

@ -116,7 +116,7 @@ impl ChunkMessage {
}
}
#[cfg(unix)]
#[cfg(all(unix, not(target_os = "macos")))]
mod sys {
use libc::{c_int, c_void, sockaddr, sockaddr_in, socklen_t};
@ -131,7 +131,68 @@ mod sys {
let addr = sockaddr_in {
sin_family: libc::AF_INET as u16,
sin_port: port.to_be(),
sin_addr: libc::in_addr { s_addr: u32::from_be_bytes([127, 0, 0, 1]).to_be() },
sin_addr: libc::in_addr { s_addr: 0 },
sin_zero: [0; 8],
};
unsafe { libc::bind(sock, &addr as *const _ as *const sockaddr, core::mem::size_of::<sockaddr_in>() as socklen_t) }
}
pub fn set_nonblocking(sock: RawSocket) -> c_int {
unsafe {
let flags = libc::fcntl(sock, libc::F_GETFL, 0);
libc::fcntl(sock, libc::F_SETFL, flags | libc::O_NONBLOCK)
}
}
pub fn recvfrom(sock: RawSocket, buf: &mut [u8], addr: &mut sockaddr_in) -> isize {
let mut addr_len = core::mem::size_of::<sockaddr_in>() as socklen_t;
unsafe {
libc::recvfrom(
sock,
buf.as_mut_ptr() as *mut c_void,
buf.len(),
0,
addr as *mut _ as *mut sockaddr,
&mut addr_len,
)
}
}
pub fn sendto(sock: RawSocket, buf: &[u8], addr: &sockaddr_in) -> isize {
unsafe {
libc::sendto(
sock,
buf.as_ptr() as *const c_void,
buf.len(),
0,
addr as *const _ as *const sockaddr,
core::mem::size_of::<sockaddr_in>() as socklen_t,
)
}
}
pub fn close(sock: RawSocket) {
unsafe { libc::close(sock) };
}
}
#[cfg(target_os = "macos")]
mod sys {
use libc::{c_int, c_void, sockaddr, sockaddr_in, socklen_t};
pub type RawSocket = c_int;
pub const INVALID_SOCKET: RawSocket = -1;
pub fn socket() -> RawSocket {
unsafe { libc::socket(libc::AF_INET, libc::SOCK_DGRAM, 0) }
}
pub fn bind(sock: RawSocket, port: u16) -> c_int {
let addr = sockaddr_in {
sin_len: core::mem::size_of::<sockaddr_in>() as u8,
sin_family: libc::AF_INET as u8,
sin_port: port.to_be(),
sin_addr: libc::in_addr { s_addr: 0 },
sin_zero: [0; 8],
};
unsafe { libc::bind(sock, &addr as *const _ as *const sockaddr, core::mem::size_of::<sockaddr_in>() as socklen_t) }