Kernel: Fix a deadlock when thread is executing terminating signal
This commit is contained in:
parent
a76c6faffc
commit
c6ded82406
|
@ -442,7 +442,7 @@ namespace Kernel
|
||||||
ASSERT(&Thread::current() == this);
|
ASSERT(&Thread::current() == this);
|
||||||
ASSERT(is_userspace());
|
ASSERT(is_userspace());
|
||||||
|
|
||||||
SpinLockGuard _(m_signal_lock);
|
auto state = m_signal_lock.lock();
|
||||||
|
|
||||||
auto& interrupt_stack = *reinterpret_cast<InterruptStack*>(kernel_stack_top() - sizeof(InterruptStack));
|
auto& interrupt_stack = *reinterpret_cast<InterruptStack*>(kernel_stack_top() - sizeof(InterruptStack));
|
||||||
ASSERT(GDT::is_user_segment(interrupt_stack.cs));
|
ASSERT(GDT::is_user_segment(interrupt_stack.cs));
|
||||||
|
@ -504,8 +504,9 @@ namespace Kernel
|
||||||
case SIGTRAP:
|
case SIGTRAP:
|
||||||
case SIGXCPU:
|
case SIGXCPU:
|
||||||
case SIGXFSZ:
|
case SIGXFSZ:
|
||||||
|
m_signal_lock.unlock(state);
|
||||||
process().exit(128 + signal, signal | 0x80);
|
process().exit(128 + signal, signal | 0x80);
|
||||||
break;
|
ASSERT_NOT_REACHED();
|
||||||
|
|
||||||
// Abnormal termination of the process
|
// Abnormal termination of the process
|
||||||
case SIGALRM:
|
case SIGALRM:
|
||||||
|
@ -519,8 +520,9 @@ namespace Kernel
|
||||||
case SIGPOLL:
|
case SIGPOLL:
|
||||||
case SIGPROF:
|
case SIGPROF:
|
||||||
case SIGVTALRM:
|
case SIGVTALRM:
|
||||||
|
m_signal_lock.unlock(state);
|
||||||
process().exit(128 + signal, signal);
|
process().exit(128 + signal, signal);
|
||||||
break;
|
ASSERT_NOT_REACHED();
|
||||||
|
|
||||||
// Ignore the signal
|
// Ignore the signal
|
||||||
case SIGCHLD:
|
case SIGCHLD:
|
||||||
|
@ -541,6 +543,8 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_signal_lock.unlock(state);
|
||||||
|
|
||||||
return has_sa_restart;
|
return has_sa_restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue