forked from Bananymous/banan-os
Kernel: Fix a deadlock when thread is executing terminating signal
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user