Kernel: Fix a deadlock when thread is executing terminating signal

This commit is contained in:
2025-06-06 06:52:27 +03:00
parent a76c6faffc
commit c6ded82406

View File

@@ -442,7 +442,7 @@ namespace Kernel
ASSERT(&Thread::current() == this);
ASSERT(is_userspace());
SpinLockGuard _(m_signal_lock);
auto state = m_signal_lock.lock();
auto& interrupt_stack = *reinterpret_cast<InterruptStack*>(kernel_stack_top() - sizeof(InterruptStack));
ASSERT(GDT::is_user_segment(interrupt_stack.cs));
@@ -504,8 +504,9 @@ namespace Kernel
case SIGTRAP:
case SIGXCPU:
case SIGXFSZ:
m_signal_lock.unlock(state);
process().exit(128 + signal, signal | 0x80);
break;
ASSERT_NOT_REACHED();
// Abnormal termination of the process
case SIGALRM:
@@ -519,8 +520,9 @@ namespace Kernel
case SIGPOLL:
case SIGPROF:
case SIGVTALRM:
m_signal_lock.unlock(state);
process().exit(128 + signal, signal);
break;
ASSERT_NOT_REACHED();
// Ignore the signal
case SIGCHLD:
@@ -541,6 +543,8 @@ namespace Kernel
}
}
m_signal_lock.unlock(state);
return has_sa_restart;
}