Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / gc / signals.c
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 }