From d5781306d8bf904cf8cd3b45845ed741d313b6a3 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Tue, 2 May 2023 11:40:21 +0200 Subject: [PATCH] Support custom pthread stacks. --- src/pthread/mod.rs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/pthread/mod.rs b/src/pthread/mod.rs index 196b628fc1..82b4ba70de 100644 --- a/src/pthread/mod.rs +++ b/src/pthread/mod.rs @@ -110,19 +110,23 @@ pub(crate) unsafe fn create(attrs: Option<&header::RlctAttr>, start_routine: ext let stack_size = attrs.stacksize.next_multiple_of(Sys::getpagesize()); - // TODO: Custom stacks - let stack_base = sys_mman::mmap( - core::ptr::null_mut(), - stack_size, - sys_mman::PROT_READ | sys_mman::PROT_WRITE, - sys_mman::MAP_SHARED | sys_mman::MAP_ANONYMOUS, - -1, - 0, - ); - if stack_base as isize == -1 { - // "Insufficient resources" - return Err(Errno(EAGAIN)); - } + let stack_base = if attrs.stack != 0 { + attrs.stack as *mut c_void + } else { + let ret = sys_mman::mmap( + core::ptr::null_mut(), + stack_size, + sys_mman::PROT_READ | sys_mman::PROT_WRITE, + sys_mman::MAP_SHARED | sys_mman::MAP_ANONYMOUS, + -1, + 0, + ); + if ret as isize == -1 { + // "Insufficient resources" + return Err(Errno(EAGAIN)); + } + ret + }; let mut flags = PthreadFlags::empty(); match i32::from(attrs.detachstate) {