YAP 7.1.0
YapSignals.h
1/*************************************************************************
2* *
3* YAP Prolog *
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
8* *
9**************************************************************************
10* *
11* File: YapSignals.h *
12* comments: YAP signal handling interface *
13* *
14* Last rev: $Date *
15* $Log $ *
16* *
17* *
18*************************************************************************/
19
20#ifndef YAPSIGNALS_H
21#define YAPSIGNALS_H 1
22
23#if HAVE_SIGNAL_H
24#include <signal.h>
25#endif
26#if HAVE_ERRNO_H
27#include <errno.h>
28#endif
29
30typedef enum
31{
32 YAP_NO_SIGNAL = 0, /* received an alarm */
33#ifdef SIGALRM
34 YAP_ALARM_SIGNAL = SIGALRM, /* received an alarm */
35#endif
36#ifdef SIGHUP
37 YAP_HUP_SIGNAL = SIGHUP, /* received SIGHUP */
38#endif
39#ifdef SIGUSR1
40 YAP_USR1_SIGNAL = SIGUSR1, /* received SIGUSR1 */
41#endif
42#ifdef SIGUSR2
43 YAP_USR2_SIGNAL = SIGUSR2, /* received SIGUSR2 */
44#endif
45#ifdef SIGINT
46 YAP_INT_SIGNAL = SIGINT, /* received SIGINT (unused for now) */
47#endif
48#ifdef SIGPIPE
49 YAP_PIPE_SIGNAL = SIGPIPE, /* call atom garbage collector asap */
50#endif
51#ifdef SIGVTALRM
52 YAP_VTALARM_SIGNAL = SIGVTALRM, /* received SIGVTALARM */
53#endif
54#ifdef SIGFPE
55 YAP_FPE_SIGNAL = SIGFPE, /* received SIGFPE */
56#endif
57#define PROLOG_SIG 31
58 YAP_WAKEUP_SIGNAL = (PROLOG_SIG+1), /* goals to wake up */
59 YAP_ITI_SIGNAL = (PROLOG_SIG+2), /* received inter thread signal */
60 YAP_TROVF_SIGNAL = (PROLOG_SIG+3), /* received trail overflow */
61 YAP_CDOVF_SIGNAL = (PROLOG_SIG+4), /* received code overflow */
62 YAP_STOVF_SIGNAL = (PROLOG_SIG+5), /* received stack overflow */
63 YAP_TRACE_SIGNAL = (PROLOG_SIG+6), /* received start trace */
64 YAP_DEBUG_SIGNAL = (PROLOG_SIG+7), /* received start debug */
65 YAP_BREAK_SIGNAL = (PROLOG_SIG+8), /* received break signal */
66 YAP_STACK_DUMP_SIGNAL = (PROLOG_SIG+9), /* received stack dump signal */
67 YAP_STATISTICS_SIGNAL = (PROLOG_SIG+10), /* received statistics */
68 YAP_AGC_SIGNAL = (PROLOG_SIG+11), /* call atom garbage collector asap */
69 YAP_WINTIMER_SIGNAL = (PROLOG_SIG+12), /* windows alarm */
70 YAP_FAIL_SIGNAL = (PROLOG_SIG+13), /* P = FAILCODE */
71 YAP_ABORT_SIGNAL = (PROLOG_SIG+14), /* P = FAILCODE */
72 YAP_EXIT_SIGNAL = (PROLOG_SIG+15), /* P = FAILCODE */
73 YAP_CREEP_SIGNAL = (PROLOG_SIG+16) /* received a creep, make sure it is the last signal */
74} yap_signals;
75
76#define Yap_get_signal(S) Yap_get_signal__(S PASS_REGS)
77#define Yap_has_a_signal() Yap_has_a_signal__(PASS_REGS1)
78#define Yap_has_signals(S1, S2) Yap_has_signals__(S1, S2 PASS_REGS)
79#define Yap_only_has_signals(S1, S2) Yap_only_has_signals__(S1, S2 PASS_REGS)
80#define Yap_has_signal(S) Yap_has_signal__(S PASS_REGS)
81#define Yap_only_has_signal(S) Yap_only_has_signal__(S PASS_REGS)
82
83INLINE_ONLY uint64_t SIGNAL_TO_BIT( yap_signals sig);
84
85INLINE_ONLY uint64_t
86SIGNAL_TO_BIT( yap_signals sig)
87{
88 return ((uint64_t)1 << (sig-1));
89}
90
91
92INLINE_ONLY int Yap_has_a_signal__ ( USES_REGS1 );
93
94INLINE_ONLY int Yap_has_signal__ ( yap_signals sig USES_REGS );
95
96INLINE_ONLY int Yap_only_has_signal__(yap_signals sig USES_REGS);
97
98INLINE_ONLY int
99Yap_has_a_signal__ (USES_REGS1)
100{
101 return LOCAL_Signals != ((uint64_t)0);
102}
103
104INLINE_ONLY int
105Yap_has_signal__(yap_signals sig USES_REGS)
106{
107 return (LOCAL_Signals & SIGNAL_TO_BIT(sig)) != ((uint64_t)0);
108}
109
110INLINE_ONLY int
111Yap_only_has_signal__(yap_signals sig USES_REGS)
112{
113 return (LOCAL_Signals & SIGNAL_TO_BIT(sig)) == SIGNAL_TO_BIT(sig);
114}
115
116
117void Yap_signal(yap_signals);
118void Yap_external_signal(int, yap_signals);
119int Yap_get_signal__(yap_signals USES_REGS);
120int Yap_has_a_signal__( USES_REGS1 );
121int Yap_has_signals__(yap_signals,yap_signals USES_REGS);
122int Yap_only_has_signals__(yap_signals,yap_signals USES_REGS);
123
124int Yap_HandleInterrupts( void );
125
126#endif