svn commit: r366429 - in head/sys: kern sys
Konstantin Belousov
kib at FreeBSD.org
Sun Oct 4 16:33:43 UTC 2020
Author: kib
Date: Sun Oct 4 16:33:42 2020
New Revision: 366429
URL: https://svnweb.freebsd.org/changeset/base/366429
Log:
Add sig_intr(9).
It gives the answer would the thread sleep according to current state
of signals and suspensions. Of course the answer is racy and allows
for false-negatives (no sleep when signal is delivered after process
lock is dropped). Also the answer might change due to signal
rescheduling among threads in multi-threaded process.
Still it is the best approximation I can provide, to answering the
question was the thread interrupted.
Reviewed by: markj
Tested by: pho, rmacklem
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
Differential revision: https://reviews.freebsd.org/D26628
Modified:
head/sys/kern/kern_sig.c
head/sys/sys/signalvar.h
Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c Sun Oct 4 16:30:05 2020 (r366428)
+++ head/sys/kern/kern_sig.c Sun Oct 4 16:33:42 2020 (r366429)
@@ -3204,6 +3204,24 @@ sig_ast_needsigchk(struct thread *td)
return (ret);
}
+int
+sig_intr(void)
+{
+ struct thread *td;
+ struct proc *p;
+ int ret;
+
+ td = curthread;
+ p = td->td_proc;
+
+ PROC_LOCK(p);
+ ret = sig_ast_checksusp(td);
+ if (ret == 0)
+ ret = sig_ast_needsigchk(td);
+ PROC_UNLOCK(p);
+ return (ret);
+}
+
void
proc_wkilled(struct proc *p)
{
Modified: head/sys/sys/signalvar.h
==============================================================================
--- head/sys/sys/signalvar.h Sun Oct 4 16:30:05 2020 (r366428)
+++ head/sys/sys/signalvar.h Sun Oct 4 16:33:42 2020 (r366429)
@@ -408,6 +408,7 @@ int sig_ffs(sigset_t *set);
void sigfastblock_clear(struct thread *td);
void sigfastblock_fetch(struct thread *td);
void sigfastblock_setpend(struct thread *td, bool resched);
+int sig_intr(void);
void siginit(struct proc *p);
void signotify(struct thread *td);
void sigqueue_delete(struct sigqueue *queue, int sig);
More information about the svn-src-all
mailing list