MCPcopy Create free account
hub / github.com/Simple-XX/SimpleKernel / SetSignalMask

Method SetSignalMask

src/task/signal.cpp:190–228  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

188}
189
190auto TaskManager::SetSignalMask(int how, uint32_t set, uint32_t* oldset)
191 -> Expected<void> {
192 auto* current = GetCurrentTask();
193 if (!current || !current->aux) {
194 return std::unexpected(Error{ErrorCode::kTaskNoCurrentTask});
195 }
196
197 auto& signals = current->aux->signals;
198
199 if (oldset) {
200 *oldset = signals.blocked.load(std::memory_order_acquire);
201 }
202
203 // SIGKILL 和 SIGSTOP 不能被屏蔽
204 uint32_t uncatchable_mask =
205 (1U << signal_number::kSigKill) | (1U << signal_number::kSigStop);
206 set &= ~uncatchable_mask;
207
208 switch (how) {
209 case signal_mask_op::kSigBlock:
210 signals.blocked.fetch_or(set, std::memory_order_release);
211 break;
212 case signal_mask_op::kSigUnblock:
213 signals.blocked.fetch_and(~set, std::memory_order_release);
214 break;
215 case signal_mask_op::kSigSetmask:
216 signals.blocked.store(set, std::memory_order_release);
217 break;
218 default:
219 return std::unexpected(Error{ErrorCode::kInvalidArgument});
220 }
221
222 signals.blocked.fetch_and(~uncatchable_mask, std::memory_order_release);
223
224 klog::Debug("SetSignalMask: pid={} mask={:#x}", current->pid,
225 signals.blocked.load(std::memory_order_acquire));
226
227 return {};
228}

Callers 1

sys_sigprocmaskFunction · 0.80

Calls 1

DebugFunction · 0.85

Tested by

no test coverage detected