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 <riandr...@android.com>
---
 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
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to