Add another helper function for binder_thread_read. All of the logic for waiting for work to do has been pulled into this function. Signed-off-by: Riley Andrews <riandrews@xxxxxxxxxxx> --- drivers/android/binder.c | 104 ++++++++++++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 38 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index b69ca0a..c98436c 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2528,6 +2528,71 @@ static int binder_work_tr_complete(struct binder_thread *thread, return 0; } +static int binder_wait_for_thread_work(struct binder_thread *thread, + bool non_block) +{ + if (binder_has_thread_work(thread)) + return 0; + + if (non_block) + return -EAGAIN; + + return wait_event_freezable(thread->wait, + binder_has_thread_work(thread)); +} + +static int binder_wait_for_proc_work(struct binder_thread *thread, + bool non_block) +{ + struct binder_proc *proc = thread->proc; + + if (!(thread->looper & (BINDER_LOOPER_STATE_REGISTERED | + BINDER_LOOPER_STATE_ENTERED))) { + binder_user_error("%d:%d ERROR: Thread waiting for process work before calling BC_REGISTER_LOOPER or BC_ENTER_LOOPER (state %x)\n", + proc->pid, thread->pid, + thread->looper); + wait_event_interruptible(binder_user_error_wait, + binder_stop_on_user_error < 2); + } + binder_set_nice(proc->default_priority); + + if (binder_has_proc_work(proc, thread)) + return 0; + + if (non_block) + return -EAGAIN; + + return wait_event_freezable_exclusive(proc->wait, + binder_has_proc_work(proc, thread)); +} + +static int binder_wait_for_work(struct binder_thread *thread, int non_block, + int wait_for_proc_work) +{ + int ret; + struct binder_proc *proc = thread->proc; + + trace_binder_wait_for_work(wait_for_proc_work, + !!thread->transaction_stack, + !list_empty(&thread->todo)); + thread->looper |= BINDER_LOOPER_STATE_WAITING; + if (wait_for_proc_work) + proc->ready_threads++; + + binder_unlock(__func__); + if (wait_for_proc_work) + ret = binder_wait_for_proc_work(thread, non_block); + else + ret = binder_wait_for_thread_work(thread, non_block); + binder_lock(__func__); + + if (wait_for_proc_work) + proc->ready_threads--; + thread->looper &= ~BINDER_LOOPER_STATE_WAITING; + + return ret; +} + static int binder_thread_read(struct binder_proc *proc, struct binder_thread *thread, binder_uintptr_t binder_buffer, size_t size, @@ -2568,44 +2633,7 @@ retry: goto done; } - - thread->looper |= BINDER_LOOPER_STATE_WAITING; - if (wait_for_proc_work) - proc->ready_threads++; - - binder_unlock(__func__); - - trace_binder_wait_for_work(wait_for_proc_work, - !!thread->transaction_stack, - !list_empty(&thread->todo)); - if (wait_for_proc_work) { - if (!(thread->looper & (BINDER_LOOPER_STATE_REGISTERED | - BINDER_LOOPER_STATE_ENTERED))) { - binder_user_error("%d:%d ERROR: Thread waiting for process work before calling BC_REGISTER_LOOPER or BC_ENTER_LOOPER (state %x)\n", - proc->pid, thread->pid, thread->looper); - wait_event_interruptible(binder_user_error_wait, - binder_stop_on_user_error < 2); - } - binder_set_nice(proc->default_priority); - if (non_block) { - if (!binder_has_proc_work(proc, thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); - } else { - if (non_block) { - if (!binder_has_thread_work(thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable(thread->wait, binder_has_thread_work(thread)); - } - - binder_lock(__func__); - - if (wait_for_proc_work) - proc->ready_threads--; - thread->looper &= ~BINDER_LOOPER_STATE_WAITING; - + ret = binder_wait_for_work(thread, non_block, wait_for_proc_work); if (ret) return ret; -- 2.2.0.rc0.207.ga3a616c _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel