22
22
// number of stacks to always keep available per pool
23
23
#define MIN_STACK_MAPPINGS_PER_POOL 5
24
24
25
- #if defined(_OS_WINDOWS_ ) || (!defined(_OS_OPENBSD_ ) && !defined(JL_HAVE_UCONTEXT ) && !defined(JL_HAVE_SIGALTSTACK ))
26
- #define JL_USE_GUARD_PAGE 1
27
25
const size_t jl_guard_size = (4096 * 8 );
28
- #else
29
- const size_t jl_guard_size = 0 ;
30
- #endif
31
-
32
26
static _Atomic (uint32_t ) num_stack_mappings = 0 ;
33
27
34
28
#ifdef _OS_WINDOWS_
35
29
#define MAP_FAILED NULL
36
30
static void * malloc_stack (size_t bufsz ) JL_NOTSAFEPOINT
37
31
{
38
- size_t guard_size = LLT_ALIGN (jl_guard_size , jl_page_size );
39
- bufsz += guard_size ;
40
-
41
32
void * stk = VirtualAlloc (NULL , bufsz , MEM_RESERVE | MEM_COMMIT , PAGE_READWRITE );
42
33
if (stk == NULL )
43
34
return MAP_FAILED ;
@@ -46,7 +37,6 @@ static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT
46
37
VirtualFree (stk , 0 , MEM_RELEASE );
47
38
return MAP_FAILED ;
48
39
}
49
- stk = (char * )stk + guard_size ;
50
40
51
41
jl_atomic_fetch_add (& num_stack_mappings , 1 );
52
42
return stk ;
@@ -55,12 +45,6 @@ static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT
55
45
56
46
static void free_stack (void * stkbuf , size_t bufsz )
57
47
{
58
- #ifdef JL_USE_GUARD_PAGE
59
- size_t guard_size = LLT_ALIGN (jl_guard_size , jl_page_size );
60
- bufsz += guard_size ;
61
- stkbuf = (char * )stkbuf - guard_size ;
62
- #endif
63
-
64
48
VirtualFree (stkbuf , 0 , MEM_RELEASE );
65
49
jl_atomic_fetch_add (& num_stack_mappings , -1 );
66
50
}
@@ -69,35 +53,23 @@ static void free_stack(void *stkbuf, size_t bufsz)
69
53
70
54
static void * malloc_stack (size_t bufsz ) JL_NOTSAFEPOINT
71
55
{
72
- #ifdef JL_USE_GUARD_PAGE
73
- size_t guard_size = LLT_ALIGN (jl_guard_size , jl_page_size );
74
- bufsz += guard_size ;
75
- #endif
76
-
77
56
void * stk = mmap (0 , bufsz , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
78
57
if (stk == MAP_FAILED )
79
58
return MAP_FAILED ;
80
59
81
- #ifdef JL_USE_GUARD_PAGE
60
+ #if !defined( JL_HAVE_UCONTEXT ) && !defined( JL_HAVE_SIGALTSTACK )
82
61
// set up a guard page to detect stack overflow
83
62
if (mprotect (stk , jl_guard_size , PROT_NONE ) == -1 ) {
84
63
munmap (stk , bufsz );
85
64
return MAP_FAILED ;
86
65
}
87
- stk = (char * )stk + guard_size ;
88
66
#endif
89
67
jl_atomic_fetch_add (& num_stack_mappings , 1 );
90
68
return stk ;
91
69
}
92
70
93
71
static void free_stack (void * stkbuf , size_t bufsz )
94
72
{
95
- #ifdef JL_USE_GUARD_PAGE
96
- size_t guard_size = LLT_ALIGN (jl_guard_size , jl_page_size );
97
- bufsz += guard_size ;
98
- stkbuf = (char * )stkbuf - guard_size ;
99
- #endif
100
-
101
73
munmap (stkbuf , bufsz );
102
74
jl_atomic_fetch_add (& num_stack_mappings , -1 );
103
75
}
0 commit comments