Binder系统server的多线程实现

驱动程序判断忙不过来

驱动程序向APP请求创建新线程

APP创建新线程

  if (proc->requested_threads + proc->ready_threads == 0 &&                       ////表示所有的线程都很忙没有空闲的线程
        proc->requested_threads_started < proc->max_threads &&
        (thread->looper & (BINDER_LOOPER_STATE_REGISTERED |
         BINDER_LOOPER_STATE_ENTERED)) /* the user-space code fails to */
         /*spawn a new thread if we leave this out */) {
        proc->requested_threads++;                                                        /////////未处理的新线程的请求
        binder_debug(BINDER_DEBUG_THREADS,
                 "binder: %d:%d BR_SPAWN_LOOPER\n",
                 proc->pid, thread->pid);
        if (put_user(BR_SPAWN_LOOPER, (uint32_t __user *)buffer))          //////当收到这个命令就requested_threads++
            return -EFAULT;v
    }

当新线程被创建会执行ioctl

case BC_REGISTER_LOOPER:

    proc->requested_threads--;
    proc->requested_threads_started++;

APP在读数据的时候顺带读到一个put_user(BR_SPAWN_LOOPER, (uint32_t __user *)buffer);这样APP就知道驱动是想让自己创建线程


驱动向APP发出创建新线程请求的条件:

1、未处理的新线程请求为0

2、空闲线程为0

3、已启动的线程小于进程max_thread



怎么写APP:

1、设置max_thread

2、收到BR_SPAWN_LOOPER创建线程

         用fork的话是没有办法访问父进程映射的空间的。因为在打开驱动的时候映射的空间被加了标志vma->vm_flags =   (vma->vm_flags | VM_DONTCOPY) &          ~VM_MAYWRITE;

         只能用pthread_creat函数

3、新线程发出ioctlBC_REGISTER_LOOPER:

4、向主线程一样进入循环一直read_Binder驱动

你可能感兴趣的:(Binder系统)