Changed signal queue to bitmap
This commit is contained in:
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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[]) {
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user