Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | /* Copyright (C) 2010,2016 Matthew Fluet. |
2 | * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh | |
3 | * Jagannathan, and Stephen Weeks. | |
4 | * Copyright (C) 1997-2000 NEC Research Institute. | |
5 | * | |
6 | * MLton is released under a BSD-style license. | |
7 | * See the file MLton-LICENSE for details. | |
8 | */ | |
9 | ||
10 | #if not HAS_SIGALTSTACK | |
11 | ||
12 | void initSignalStack (__attribute__ ((unused)) GC_state s) { | |
13 | } | |
14 | ||
15 | #else | |
16 | ||
17 | void initSignalStack (GC_state s) { | |
18 | static bool init = FALSE; | |
19 | static stack_t altstack; | |
20 | ||
21 | if (! init) { | |
22 | init = TRUE; | |
23 | size_t ss_size = align (SIGSTKSZ, s->sysvals.pageSize); | |
24 | size_t psize = s->sysvals.pageSize; | |
25 | int prot = PROT_READ | PROT_WRITE; | |
26 | #if NEEDS_SIGALTSTACK_EXEC | |
27 | prot = prot | PROT_EXEC; | |
28 | #endif | |
29 | void *ss_sp = GC_mmapAnon_safe_protect (NULL, 2 * ss_size, prot, psize, psize); | |
30 | altstack.ss_sp = (void*)((pointer)ss_sp + ss_size); | |
31 | altstack.ss_size = ss_size; | |
32 | altstack.ss_flags = 0; | |
33 | } | |
34 | sigaltstack (&altstack, NULL); | |
35 | } | |
36 | ||
37 | #endif | |
38 | ||
39 | void GC_initSignalStack (GC_state s) { | |
40 | initSignalStack (s); | |
41 | } |