From b50781ed2a2aa22c4bd65cf2ad32f6e4dbe78764 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 2 Jan 2020 15:19:30 +0200 Subject: [PATCH] Changed signal queue to bitmap --- include/sys/thread.h | 6 +++--- sys/amd64/sys/sched.c | 20 ++++++++++++++------ sys/amd64/sys/thread.c | 10 +++------- usr/init.c | 2 ++ usr/libc/signal.c | 10 +++++----- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/include/sys/thread.h b/include/sys/thread.h index e0b62d3..321df2d 100644 --- a/include/sys/thread.h +++ b/include/sys/thread.h @@ -33,9 +33,9 @@ struct thread { struct vfs_ioctx ioctx; struct ofile fds[4]; - // Signal processing queue - int sigqueue[8]; - size_t sigqsz; + // Signals + uint32_t sigq; + // Signal handler stack and entry uintptr_t sigentry; uintptr_t sigstack; diff --git a/sys/amd64/sys/sched.c b/sys/amd64/sys/sched.c index 4ef29b1..285c206 100644 --- a/sys/amd64/sys/sched.c +++ b/sys/amd64/sys/sched.c @@ -305,15 +305,23 @@ int sched(void) { amd64_thread_sigret(to); } - if (to->sigqsz) { + if (to->sigq) { // Should we enter signal handler? - int signum = to->sigqueue[0]; - --to->sigqsz; - // Shift the queue - for (size_t i = 0; i < to->sigqsz; ++i) { - to->sigqueue[i] = to->sigqueue[i + 1]; + int signum = 0; + if (to->sigq & (1 << 8)) { + // SIGKILL + panic("TODO: properly handle SIGKILL\n"); } + for (size_t i = 0; i < 32; ++i) { + if (to->sigq & (1 << i)) { + signum = i + 1; + to->sigq &= ~(1 << i); + break; + } + } + _assert(signum); + amd64_thread_sigenter(to, signum); } diff --git a/sys/amd64/sys/thread.c b/sys/amd64/sys/thread.c index 96504d5..27aba9c 100644 --- a/sys/amd64/sys/thread.c +++ b/sys/amd64/sys/thread.c @@ -129,7 +129,7 @@ int thread_init( t->space = space; t->flags = flags; t->next = NULL; - t->sigqsz = 0; + t->sigq = 0; memset(&t->ioctx, 0, sizeof(t->ioctx)); memset(t->fds, 0, sizeof(t->fds)); @@ -164,12 +164,8 @@ void thread_cleanup(struct thread *t) { // TODO: may be moved to platform-independent file void thread_signal(struct thread *t, int s) { _assert(t); - - if (t->sigqsz == 8) { - panic("Thread received too many unhandled signals\n"); - } - - t->sigqueue[t->sigqsz++] = s; + _assert(s > 0 && s <= 32); + t->sigq |= (1 << (s - 1)); } int sys_execve(const char *filename, const char *const argv[], const char *const envp[]) { diff --git a/usr/init.c b/usr/init.c index f4ee9e7..22a39fd 100644 --- a/usr/init.c +++ b/usr/init.c @@ -288,6 +288,8 @@ int main(int argc, char **argv) { size_t l = 0; int res; + abort(); + prompt(); while (1) { if (read(STDIN_FILENO, &c, 1) < 0) { diff --git a/usr/libc/signal.c b/usr/libc/signal.c index 76f19c4..c42dfb1 100644 --- a/usr/libc/signal.c +++ b/usr/libc/signal.c @@ -11,20 +11,20 @@ void SIG_IGN(int signum) { } void SIG_DFL(int signum) { - // TODO: use getpid() + int pid = getpid(); switch (signum) { case SIGKILL: - printf(": killed\n"); + printf("%d: killed\n", pid); break; case SIGABRT: - printf(": aborted\n"); + printf("%d: aborted\n", pid); break; case SIGSEGV: - printf(": segmentation fault\n"); + printf("%d: segmentation fault\n", pid); break; default: - printf(": signal %d\n", signum); + printf("%d: signal %d\n", pid, signum); break; }