terminate(): fix update_lock and threads_lock order to avoid deadlock
This commit is contained in:
@ -1004,13 +1004,15 @@ void terminate(int rc, int sig)
|
|||||||
sync_child_event(proc->monitoring_event);
|
sync_child_event(proc->monitoring_event);
|
||||||
|
|
||||||
// clean up threads
|
// clean up threads
|
||||||
mcs_rwlock_writer_lock(&proc->threads_lock, &lock); // conflict clone
|
|
||||||
mcs_rwlock_writer_lock_noirq(&proc->update_lock, &updatelock);
|
mcs_rwlock_writer_lock_noirq(&proc->update_lock, &updatelock);
|
||||||
|
mcs_rwlock_writer_lock(&proc->threads_lock, &lock); // conflict clone
|
||||||
if (proc->status == PS_EXITED) {
|
if (proc->status == PS_EXITED) {
|
||||||
|
dkprintf("%s: PID: %d, TID: %d PS_EXITED already\n",
|
||||||
|
__FUNCTION__, proc->pid, mythread->tid);
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
mythread->status = PS_EXITED;
|
mythread->status = PS_EXITED;
|
||||||
mcs_rwlock_writer_unlock_noirq(&proc->update_lock, &updatelock);
|
|
||||||
mcs_rwlock_writer_unlock(&proc->threads_lock, &lock);
|
mcs_rwlock_writer_unlock(&proc->threads_lock, &lock);
|
||||||
|
mcs_rwlock_writer_unlock_noirq(&proc->update_lock, &updatelock);
|
||||||
release_thread(mythread);
|
release_thread(mythread);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
schedule();
|
schedule();
|
||||||
@ -1018,11 +1020,13 @@ void terminate(int rc, int sig)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dkprintf("%s: PID: %d, TID: %d setting PS_EXITED\n",
|
||||||
|
__FUNCTION__, proc->pid, mythread->tid);
|
||||||
exit_status = ((rc & 0x00ff) << 8) | (sig & 0xff);
|
exit_status = ((rc & 0x00ff) << 8) | (sig & 0xff);
|
||||||
mythread->exit_status = exit_status;
|
mythread->exit_status = exit_status;
|
||||||
proc->status = PS_EXITED;
|
proc->status = PS_EXITED;
|
||||||
mcs_rwlock_writer_unlock_noirq(&proc->update_lock, &updatelock);
|
|
||||||
mcs_rwlock_writer_unlock(&proc->threads_lock, &lock);
|
mcs_rwlock_writer_unlock(&proc->threads_lock, &lock);
|
||||||
|
mcs_rwlock_writer_unlock_noirq(&proc->update_lock, &updatelock);
|
||||||
|
|
||||||
terminate_mcexec(rc, sig);
|
terminate_mcexec(rc, sig);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user