ANDROID: binder: don't enqueue death notifications to thread todo.
This allows userspace to request death notifications without having to worry about getting an immediate callback on the same thread; one scenario where this would be problematic is if the death recipient handler grabs a lock that was already taken earlier (eg as part of a nested transaction). Signed-off-by: Martijn Coenen <maco@android.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
858b271968
commit
bb74562a7f
|
@ -3499,22 +3499,12 @@ static int binder_thread_write(struct binder_proc *proc,
|
|||
ref->death = death;
|
||||
if (ref->node->proc == NULL) {
|
||||
ref->death->work.type = BINDER_WORK_DEAD_BINDER;
|
||||
if (thread->looper &
|
||||
(BINDER_LOOPER_STATE_REGISTERED |
|
||||
BINDER_LOOPER_STATE_ENTERED))
|
||||
binder_enqueue_work(
|
||||
proc,
|
||||
&ref->death->work,
|
||||
&thread->todo);
|
||||
else {
|
||||
binder_inner_proc_lock(proc);
|
||||
binder_enqueue_work_ilocked(
|
||||
&ref->death->work,
|
||||
&proc->todo);
|
||||
binder_wakeup_proc_ilocked(
|
||||
proc);
|
||||
binder_inner_proc_unlock(proc);
|
||||
}
|
||||
|
||||
binder_inner_proc_lock(proc);
|
||||
binder_enqueue_work_ilocked(
|
||||
&ref->death->work, &proc->todo);
|
||||
binder_wakeup_proc_ilocked(proc);
|
||||
binder_inner_proc_unlock(proc);
|
||||
}
|
||||
} else {
|
||||
if (ref->death == NULL) {
|
||||
|
|
Loading…
Reference in New Issue