mm-qcamera-daemon主函数分析

目录

main函数核心


main函数核心

    main函数的主要任务包含在一个do{ } while(1)循环中. while循环中主要是监听文件描述符,故mai函数是由文件的读写来进行驱动的。

    所有的文件描述符被封装成结构体 read_fd_info_t.其定义如下:

/** read_fd_info_t
 * @type -- either domain socket fd or mct fd
 * @session -- session index
 * @fd  --
 *    in case of domain socket fd: fd[0]
 *    in case of mct pipe fd: fd[0] - server read fd
 *                                        fd[1] - mct write fd
 **/
typedef struct _read_fd_info {
    read_fd_type type;
    typedef enum _read_fd_type {
        RD_FD_HAL, // 内核节点 /dev/video0
        RD_DS_FD_HAL, // socket通信
        RD_PIPE_FD_MCT, // 管道通信
        RD_FD_NONE
    } read_fd_type;
    unsigned int session;

    int fd[2];
} read_fd_info_t;

​各种类型的文件描述符,将做为结构体mct_list_t中的data域,最后以链表的形式保存下来,最后形成的链表如下:

    main函数的主要任务包含在一个do{ } while(1)循环中. while循环中主要是监听文件描述符,故mai函数是由文件的读写来进行驱动的。

    所有的文件描述符被封装成结构体 read_fd_info_t.其定义如下:

/** read_fd_info_t

 * @type -- either domain socket fd or mct fd

 * @session -- session index

 * @fd  --

 *    in case of domain socket fd: fd[0]

 *    in case of mct pipe fd: fd[0] - server read fd

 *                                        fd[1] - mct write fd

 **/

typedef struct _read_fd_info {

    read_fd_type type;

typedef enum _read_fd_type {

RD_FD_HAL, // 内核节点 /dev/video0

RD_DS_FD_HAL, // socket通信

RD_PIPE_FD_MCT, // 管道通信

RD_FD_NONE

} read_fd_type;

    unsigned int session;

    int fd[2];

} read_fd_info_t;

​各种类型的文件描述符,将做为结构体mct_list_t中的data域,最后以链表的形式保存下来,最后形成的链表如下:

主程序通过如下循环去检测这些文件描述符:

do {

    FD_ZERO(&(select_fds.fds));

    mct_list_traverse(listen_fd_list, server_reset_select_fd, &select_fds);



    // no timeout

    ret = select(select_fds.select_fd + 1, &(select_fds.fds), NULL, NULL, NULL);



    if (ret > 0) {

        mct_list_t  *find_list;

        read_fd_info_t *fd_info;



        find_list = mct_list_find_custom(listen_fd_list, &(select_fds.fds), server_check_listen_fd);

        if (!find_list)

            continue;

  

        fd_info = (read_fd_info_t *)find_list->data;



        switch (fd_info->type) {

            case RD_FD_HAL:

                    ......

            case RD_DS_FD_HAL:

                    ......

            case RD_PIPE_FD_MCT:

                    ......

            default:

              continue;

        }



        switch (proc_ret.result) {

            case RESULT_NEW_SESSION:

                    ......

            case RESULT_DEL_SESSION:

                    ......

            case RESULT_FAILURE:

                    ......

            case RESULT_SUCCESS:

                    ......

            default:

               break;

        }

    }

} while(1);

主程序通过如下循环去检测这些文件描述符:

do {
    FD_ZERO(&(select_fds.fds));
    mct_list_traverse(listen_fd_list, server_reset_select_fd, &select_fds);
    // no timeout
    ret = select(select_fds.select_fd + 1, &(select_fds.fds), NULL, NULL, NULL);
    if (ret > 0) {
        mct_list_t  *find_list;
        read_fd_info_t *fd_info;
        find_list = mct_list_find_custom(listen_fd_list, &(select_fds.fds), server_check_listen_fd);
        if (!find_list)
            continue;
  
        fd_info = (read_fd_info_t *)find_list->data;
        switch (fd_info->type) {
            case RD_FD_HAL:
                    ......
            case RD_DS_FD_HAL:
                    ......
            case RD_PIPE_FD_MCT:
                    ......
            default:
              continue;
        }
        switch (proc_ret.result) {
            case RESULT_NEW_SESSION:
                    ......
            case RESULT_DEL_SESSION:
                    ......
            case RESULT_FAILURE:
                    ......
            case RESULT_SUCCESS:
                    ......
            default:
               break;
        }
    }
} while(1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塞外totem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值