Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: lib/Support/Unix/Signals.inc

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/Support/Unix/Program.inc ('k') | lib/Support/Unix/TimeValue.inc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===// 1 //===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file defines some helpful functions for dealing with the possibility of 10 // This file defines some helpful functions for dealing with the possibility of
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 }; 86 };
87 87
88 static unsigned NumRegisteredSignals = 0; 88 static unsigned NumRegisteredSignals = 0;
89 static struct { 89 static struct {
90 struct sigaction SA; 90 struct sigaction SA;
91 int SigNo; 91 int SigNo;
92 } RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])]; 92 } RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])];
93 93
94 94
95 static void RegisterHandler(int Signal) { 95 static void RegisterHandler(int Signal) {
96 #if !defined(__native_client__)
96 assert(NumRegisteredSignals < 97 assert(NumRegisteredSignals <
97 sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) && 98 sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) &&
98 "Out of space for signal handlers!"); 99 "Out of space for signal handlers!");
99 100
100 struct sigaction NewHandler; 101 struct sigaction NewHandler;
101 102
102 NewHandler.sa_handler = SignalHandler; 103 NewHandler.sa_handler = SignalHandler;
103 NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND; 104 NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND;
104 sigemptyset(&NewHandler.sa_mask); 105 sigemptyset(&NewHandler.sa_mask);
105 106
106 // Install the new handler, save the old one in RegisteredSignalInfo. 107 // Install the new handler, save the old one in RegisteredSignalInfo.
107 sigaction(Signal, &NewHandler, 108 sigaction(Signal, &NewHandler,
108 &RegisteredSignalInfo[NumRegisteredSignals].SA); 109 &RegisteredSignalInfo[NumRegisteredSignals].SA);
109 RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal; 110 RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal;
110 ++NumRegisteredSignals; 111 ++NumRegisteredSignals;
112 #endif // (__native_client__)
111 } 113 }
112 114
113 static void RegisterHandlers() { 115 static void RegisterHandlers() {
114 // If the handlers are already registered, we're done. 116 // If the handlers are already registered, we're done.
115 if (NumRegisteredSignals != 0) return; 117 if (NumRegisteredSignals != 0) return;
116 118
117 for (auto S : IntSigs) RegisterHandler(S); 119 for (auto S : IntSigs) RegisterHandler(S);
118 for (auto S : KillSigs) RegisterHandler(S); 120 for (auto S : KillSigs) RegisterHandler(S);
119 } 121 }
120 122
121 static void UnregisterHandlers() { 123 static void UnregisterHandlers() {
124 #if !defined(__native_client__)
122 // Restore all of the signal handlers to how they were before we showed up. 125 // Restore all of the signal handlers to how they were before we showed up.
123 for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i) 126 for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i)
124 sigaction(RegisteredSignalInfo[i].SigNo, 127 sigaction(RegisteredSignalInfo[i].SigNo,
125 &RegisteredSignalInfo[i].SA, nullptr); 128 &RegisteredSignalInfo[i].SA, nullptr);
126 NumRegisteredSignals = 0; 129 NumRegisteredSignals = 0;
130 #endif // (__native_client__)
127 } 131 }
128 132
129 133
130 /// RemoveFilesToRemove - Process the FilesToRemove list. This function 134 /// RemoveFilesToRemove - Process the FilesToRemove list. This function
131 /// should be called with the SignalsMutex lock held. 135 /// should be called with the SignalsMutex lock held.
132 /// NB: This must be an async signal safe function. It cannot allocate or free 136 /// NB: This must be an async signal safe function. It cannot allocate or free
133 /// memory, even in debug builds. 137 /// memory, even in debug builds.
134 static void RemoveFilesToRemove() { 138 static void RemoveFilesToRemove() {
135 // We avoid iterators in case of debug iterators that allocate or release 139 // We avoid iterators in case of debug iterators that allocate or release
136 // memory. 140 // memory.
(...skipping 23 matching lines...) Expand all
160 } 164 }
161 165
162 // SignalHandler - The signal handler that runs. 166 // SignalHandler - The signal handler that runs.
163 static RETSIGTYPE SignalHandler(int Sig) { 167 static RETSIGTYPE SignalHandler(int Sig) {
164 // Restore the signal behavior to default, so that the program actually 168 // Restore the signal behavior to default, so that the program actually
165 // crashes when we return and the signal reissues. This also ensures that if 169 // crashes when we return and the signal reissues. This also ensures that if
166 // we crash in our signal handler that the program will terminate immediately 170 // we crash in our signal handler that the program will terminate immediately
167 // instead of recursing in the signal handler. 171 // instead of recursing in the signal handler.
168 UnregisterHandlers(); 172 UnregisterHandlers();
169 173
174 #if !defined(__native_client__)
170 // Unmask all potentially blocked kill signals. 175 // Unmask all potentially blocked kill signals.
171 sigset_t SigMask; 176 sigset_t SigMask;
172 sigfillset(&SigMask); 177 sigfillset(&SigMask);
173 sigprocmask(SIG_UNBLOCK, &SigMask, nullptr); 178 sigprocmask(SIG_UNBLOCK, &SigMask, nullptr);
179 #endif
174 180
175 { 181 {
176 unique_lock<SmartMutex<true>> Guard(*SignalsMutex); 182 unique_lock<SmartMutex<true>> Guard(*SignalsMutex);
177 RemoveFilesToRemove(); 183 RemoveFilesToRemove();
178 184
179 if (std::find(std::begin(IntSigs), std::end(IntSigs), Sig) 185 if (std::find(std::begin(IntSigs), std::end(IntSigs), Sig)
180 != std::end(IntSigs)) { 186 != std::end(IntSigs)) {
181 if (InterruptFunction) { 187 if (InterruptFunction) {
182 void (*IF)() = InterruptFunction; 188 void (*IF)() = InterruptFunction;
183 Guard.unlock(); 189 Guard.unlock();
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 abort(); 539 abort();
534 } 540 }
535 541
536 void abort() { 542 void abort() {
537 raise(SIGABRT); 543 raise(SIGABRT);
538 usleep(1000); 544 usleep(1000);
539 __builtin_trap(); 545 __builtin_trap();
540 } 546 }
541 547
542 #endif 548 #endif
OLDNEW
« no previous file with comments | « lib/Support/Unix/Program.inc ('k') | lib/Support/Unix/TimeValue.inc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698