Changed signal queue to bitmap

This commit is contained in:
Mark
2020-01-02 15:19:30 +02:00
parent bf21f00550
commit b50781ed2a
5 changed files with 27 additions and 21 deletions
+3 -3
View File
@@ -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;
+14 -6
View File
@@ -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);
}
+3 -7
View File
@@ -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[]) {
+2
View File
@@ -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) {
+5 -5
View File
@@ -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;
}