f29d4ddb7e8dfdbef479c1ed977abbefe6a1cf66
[WebKit-https.git] / Source / WTF / wtf / threads / Signals.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if USE(PTHREADS)
29
30 #include <signal.h>
31 #include <wtf/Function.h>
32
33 namespace WTF {
34
35 // Note that SIGUSR1 is used in Pthread-based ports except for Darwin to suspend and resume threads.
36 enum class Signal {
37     // Usr will always chain to any non-default handler install before us. Since there is no way to know
38     // if a signal was intended exclusively for us.
39     Usr,
40
41     // These signals will only chain if we don't have a handler that can process them. If there is nothing
42     // to chain to we restore the default handler and crash.
43     Trap,
44     Ill,
45     SegV,
46     Bus,
47     NumberOfSignals,
48     Unknown = NumberOfSignals
49 };
50
51 inline int toSystemSignal(Signal signal)
52 {
53     switch (signal) {
54     case Signal::SegV: return SIGSEGV;
55     case Signal::Bus: return SIGBUS;
56     case Signal::Ill: return SIGILL;
57     case Signal::Usr: return SIGUSR2;
58     case Signal::Trap: return SIGTRAP;
59     default: break;
60     }
61     RELEASE_ASSERT_NOT_REACHED();
62 }
63
64 inline Signal fromSystemSignal(int signal)
65 {
66     switch (signal) {
67     case SIGSEGV: return Signal::SegV;
68     case SIGBUS: return Signal::Bus;
69     case SIGILL: return Signal::Ill;
70     case SIGUSR2: return Signal::Usr;
71     case SIGTRAP: return Signal::Trap;
72     default: return Signal::Unknown;
73     }
74 }
75
76 enum class SignalAction {
77     Handled,
78     NotHandled,
79     ForceDefault
80 };
81
82 using SignalHandler = Function<SignalAction(int, siginfo_t*, void*)>;
83
84 // Call this method whenever you want to install a signal handler. It's ok to call this function lazily.
85 // Note: Your signal handler will be called every time the handler for the desired signal is called.
86 // Thus it is your responsibility to discern if the signal fired was yours.
87 // This function is currently a one way street i.e. once installed, a signal handler cannot be uninstalled.
88 WTF_EXPORT_PRIVATE void installSignalHandler(Signal, SignalHandler&&);
89
90 } // namespace WTF
91
92 using WTF::Signal;
93 using WTF::toSystemSignal;
94 using WTF::fromSystemSignal;
95 using WTF::SignalAction;
96 using WTF::installSignalHandler;
97
98 #endif // USE(PTHREADS)