File: Signal.c

package info (click to toggle)
mlton 20100608-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 34,980 kB
  • ctags: 69,089
  • sloc: ansic: 18,421; lisp: 2,879; makefile: 1,570; sh: 1,325; pascal: 256; asm: 97
file content (111 lines) | stat: -rw-r--r-- 2,858 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "platform.h"

extern struct GC_state gcState;

static void handler (int signum) {
  GC_handler (&gcState, signum);
}

C_Errno_t(C_Int_t) Posix_Signal_default (C_Signal_t signum) {
  struct sigaction sa;

  sigdelset (GC_getSignalsHandledAddr (&gcState), signum);
  memset (&sa, 0, sizeof(sa));
  sa.sa_handler = SIG_DFL;
  return sigaction (signum, &sa, NULL);
}

C_Errno_t(C_Int_t) Posix_Signal_isDefault (C_Int_t signum, Ref(C_Int_t) isDef) {
  int res;
  struct sigaction sa;

  memset (&sa, 0, sizeof(sa));
  res = sigaction (signum, NULL, &sa);
  *((C_Int_t*)isDef) = sa.sa_handler == SIG_DFL;
  return res;
}

C_Errno_t(C_Int_t) Posix_Signal_ignore (C_Signal_t signum) {
  struct sigaction sa;

  sigdelset (GC_getSignalsHandledAddr (&gcState), signum);
  memset (&sa, 0, sizeof(sa));
  sa.sa_handler = SIG_IGN;
  return sigaction (signum, &sa, NULL);
}

C_Errno_t(C_Int_t) Posix_Signal_isIgnore (C_Int_t signum, Ref(C_Int_t) isIgn) {
  int res;
  struct sigaction sa;

  memset (&sa, 0, sizeof(sa));
  res = sigaction (signum, NULL, &sa);
  *((C_Int_t*)isIgn) = sa.sa_handler == SIG_IGN;
  return res;
}

C_Errno_t(C_Int_t) Posix_Signal_handlee (C_Int_t signum) {
  static struct sigaction sa;

  sigaddset (GC_getSignalsHandledAddr (&gcState), signum);
  memset (&sa, 0, sizeof(sa));
  /* The mask must be full because GC_handler reads and writes 
   * s->signalsPending (else there is a race condition).
   */
  sigfillset (&sa.sa_mask);
#if HAS_SIGALTSTACK
  sa.sa_flags = SA_ONSTACK;
#endif
  sa.sa_handler = handler;
  return sigaction (signum, &sa, NULL);
}

void Posix_Signal_handleGC (void) {
  GC_setGCSignalHandled (&gcState, TRUE);
}

C_Int_t Posix_Signal_isPending (C_Int_t signum) {
  return sigismember (GC_getSignalsPendingAddr (&gcState), signum);
}

C_Int_t Posix_Signal_isPendingGC (void) {
  return GC_getGCSignalPending (&gcState);
}

void Posix_Signal_resetPending (void) {
  sigemptyset (GC_getSignalsPendingAddr (&gcState));
  GC_setGCSignalPending (&gcState, FALSE);
}

static sigset_t Posix_Signal_sigset;

C_Errno_t(C_Int_t) Posix_Signal_sigaddset (C_Signal_t signum) {
  return sigaddset (&Posix_Signal_sigset, signum);
}

C_Errno_t(C_Int_t) Posix_Signal_sigdelset (C_Signal_t signum) {
  return sigdelset (&Posix_Signal_sigset, signum);
}

C_Errno_t(C_Int_t) Posix_Signal_sigemptyset (void) {
  return sigemptyset (&Posix_Signal_sigset);
}

C_Errno_t(C_Int_t) Posix_Signal_sigfillset (void) {
  return sigfillset (&Posix_Signal_sigset);
}

C_Errno_t(C_Int_t) Posix_Signal_sigismember (C_Signal_t signum) {
  return sigismember (&Posix_Signal_sigset, signum);
}

C_Errno_t(C_Int_t) Posix_Signal_sigprocmask (C_Int_t how) {
  return sigprocmask (how, &Posix_Signal_sigset, &Posix_Signal_sigset);
}

void Posix_Signal_sigsuspend (void) {
  int res;

  res = sigsuspend (&Posix_Signal_sigset);
  assert (-1 == res);
}