MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sigqueue_add

Function sigqueue_add

freebsd/kern/kern_sig.c:377–445  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

375}
376
377static int
378sigqueue_add(sigqueue_t *sq, int signo, ksiginfo_t *si)
379{
380 struct proc *p = sq->sq_proc;
381 struct ksiginfo *ksi;
382 int ret = 0;
383
384 KASSERT(sq->sq_flags & SQ_INIT, ("sigqueue not inited"));
385
386 /*
387 * SIGKILL/SIGSTOP cannot be caught or masked, so take the fast path
388 * for these signals.
389 */
390 if (signo == SIGKILL || signo == SIGSTOP || si == NULL) {
391 SIGADDSET(sq->sq_kill, signo);
392 goto out_set_bit;
393 }
394
395 /* directly insert the ksi, don't copy it */
396 if (si->ksi_flags & KSI_INS) {
397 if (si->ksi_flags & KSI_HEAD)
398 TAILQ_INSERT_HEAD(&sq->sq_list, si, ksi_link);
399 else
400 TAILQ_INSERT_TAIL(&sq->sq_list, si, ksi_link);
401 si->ksi_sigq = sq;
402 goto out_set_bit;
403 }
404
405 if (__predict_false(ksiginfo_zone == NULL)) {
406 SIGADDSET(sq->sq_kill, signo);
407 goto out_set_bit;
408 }
409
410 if (p != NULL && p->p_pendingcnt >= max_pending_per_proc) {
411 signal_overflow++;
412 ret = EAGAIN;
413 } else if ((ksi = ksiginfo_alloc(0)) == NULL) {
414 signal_alloc_fail++;
415 ret = EAGAIN;
416 } else {
417 if (p != NULL)
418 p->p_pendingcnt++;
419 ksiginfo_copy(si, ksi);
420 ksi->ksi_signo = signo;
421 if (si->ksi_flags & KSI_HEAD)
422 TAILQ_INSERT_HEAD(&sq->sq_list, ksi, ksi_link);
423 else
424 TAILQ_INSERT_TAIL(&sq->sq_list, ksi, ksi_link);
425 ksi->ksi_sigq = sq;
426 }
427
428 if (ret != 0) {
429 if ((si->ksi_flags & KSI_PTRACE) != 0) {
430 SIGADDSET(sq->sq_ptrace, signo);
431 ret = 0;
432 goto out_set_bit;
433 } else if ((si->ksi_flags & KSI_TRAP) != 0 ||
434 (si->ksi_flags & KSI_SIGQ) == 0) {

Callers 3

tdsendsignalFunction · 0.85
ptracestopFunction · 0.85
issignalFunction · 0.85

Calls 2

ksiginfo_allocFunction · 0.85
ksiginfo_copyFunction · 0.85

Tested by

no test coverage detected