Reland r216808, underlying lldb bug has been fixed.
[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 #include <wtf/PlatformRegisters.h>
33
34 namespace WTF {
35
36 // Note that SIGUSR1 is used in Pthread-based ports except for Darwin to suspend and resume threads.
37 enum class Signal {
38     // Usr will always chain to any non-default handler install before us. Since there is no way to know
39     // if a signal was intended exclusively for us.
40     Usr,
41
42     // These signals will only chain if we don't have a handler that can process them. If there is nothing
43     // to chain to we restore the default handler and crash.
44     Trap,
45     Ill,
46     SegV,
47     Bus,
48     NumberOfSignals,
49     Unknown = NumberOfSignals
50 };
51
52 inline int toSystemSignal(Signal signal)
53 {
54     switch (signal) {
55     case Signal::SegV: return SIGSEGV;
56     case Signal::Bus: return SIGBUS;
57     case Signal::Ill: return SIGILL;
58     case Signal::Usr: return SIGUSR2;
59     case Signal::Trap: return SIGTRAP;
60     default: break;
61     }
62     RELEASE_ASSERT_NOT_REACHED();
63 }
64
65 inline Signal fromSystemSignal(int signal)
66 {
67     switch (signal) {
68     case SIGSEGV: return Signal::SegV;
69     case SIGBUS: return Signal::Bus;
70     case SIGILL: return Signal::Ill;
71     case SIGUSR2: return Signal::Usr;
72     case SIGTRAP: return Signal::Trap;
73     default: return Signal::Unknown;
74     }
75 }
76
77 enum class SignalAction {
78     Handled,
79     NotHandled,
80     ForceDefault
81 };
82
83 struct SigInfo {
84     void* faultingAddress { 0 };
85 };
86
87 using SignalHandler = Function<SignalAction(Signal, SigInfo&, PlatformRegisters&)>;
88
89 // Call this method whenever you want to install a signal handler. It's ok to call this function lazily.
90 // Note: Your signal handler will be called every time the handler for the desired signal is called.
91 // Thus it is your responsibility to discern if the signal fired was yours.
92 // This function is currently a one way street i.e. once installed, a signal handler cannot be uninstalled.
93 WTF_EXPORT_PRIVATE void installSignalHandler(Signal, SignalHandler&&);
94
95
96 #if HAVE(MACH_EXCEPTIONS)
97 class Thread;
98 void registerThreadForMachExceptionHandling(Thread*);
99 void unregisterThreadForMachExceptionHandling(Thread*);
100
101 void handleSignalsWithMach();
102 #endif // HAVE(MACH_EXCEPTIONS)
103
104 } // namespace WTF
105
106 #if HAVE(MACH_EXCEPTIONS)
107 using WTF::registerThreadForMachExceptionHandling;
108 using WTF::unregisterThreadForMachExceptionHandling;
109 using WTF::handleSignalsWithMach;
110 #endif // HAVE(MACH_EXCEPTIONS)
111
112 using WTF::Signal;
113 using WTF::SigInfo;
114 using WTF::toSystemSignal;
115 using WTF::fromSystemSignal;
116 using WTF::SignalAction;
117 using WTF::installSignalHandler;
118
119 #endif // USE(PTHREADS)