导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【FAQ】全志R329如何解决调用Bluez mainloop_add_fd函数失败的问题?

    其它全志芯片讨论区
    r329 r328 r818 faq 技术支持
    1
    1
    1291
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 编辑

      问题背景

      Tina系统使用的蓝牙协议栈为开源bluez协议栈,在上层应用开发的时候会常常使用mainloop_add_fd函数,尤其是btmanager中也有很多模块是调用了该函数。

      问题描述

      在使用Tina btmanager ble模块时,启动异常,提示打印"Failed to add listen socket(11),error(-38)",详细如下:

      1607334876.975885: [gatt_run:355]:  ++
      1607334876.976066: [l2cap_le_att_listen:263]:  ++
      1607334876.976208: [l2cap_le_att_listen:296]:  Started listening on ATT channel
      1607334876.976311: [gatt_run:371]:  sockfds 12 13
      1607334876.976820: [gatt_set_bta_mainloop_id:27]:  tid: 3047021836
      1607334876.977276: [gatt_run:373]:  tid 3047021836
      1607334876.977541: [gatt_set_bta_cmd_fd:39]:  gatt_commfds 12 13
      1607334876.977884: [gatt_bta_register_handler:44]:  ++
      1607334876.979351: [gatt_run:383]:  Failed to add listen socket(11),error(-38)
      

      问题分析
      "[gatt_run:383]: Failed to add listen socket(11),error(-38)"该行错误打印,提示的源代码如下:

      ```
      

      ret = mainloop_add_fd(fd, EPOLLIN, server_listen_cb, server, NULL);
      if (ret < 0) {
      BTMG_ERROR("Failed to add listen socket(%d),error(%d)\n",fd,ret);
      close(fd);
      netcfg_state = 0;
      return NULL;
      }

      从上可以判断是调用了mainloop_add_fd函数异常,该函数是链接的开源bluez协议栈中的库,于是搜索了bluez中关于mainloop_add_fd的实现,发现实现该函数有有三处地方,分别是
      
      (1)src/shared/mainloop-ell.c:编入到src/.libs/libshared-ell.a库中。
      
      

      int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
      void *user_data, mainloop_destroy_func destroy)
      {
      return -ENOSYS;
      }

      (2)src/shared/mainloop-glib.c:编入到src/.libs/libshared-glib.a库中。
      
      

      int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
      void *user_data, mainloop_destroy_func destroy)
      {
      return -ENOSYS;
      }

      (3) src/shared/mainloop.c:编入到src/.libs/libshared-mainloop.a库中。
      
      

      int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
      void *user_data, mainloop_destroy_func destroy)
      {
      struct mainloop_data *data;
      struct epoll_event ev;
      int err;
      if (fd < 0 || fd > MAX_MAINLOOP_ENTRIES - 1 || !callback)
      return -EINVAL;
      data = malloc(sizeof(*data));
      if (!data)
      return -ENOMEM;
      memset(data, 0, sizeof(*data));
      data->fd = fd;
      data->events = events;
      data->callback = callback;
      data->destroy = destroy;
      data->user_data = user_data;
      memset(&ev, 0, sizeof(ev));
      ev.events = events;
      ev.data.ptr = data;
      err = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, data->fd, &ev);
      if (err < 0) {
      free(data);
      return err;
      }
      mainloop_list[fd] = data;
      return 0;
      }

      而 Failed to add listen socket(11),error(-38)提示-38正好是"-ENOSYS", 在errno.h中有定义
      
      

      #define ENOSYS 38 /* Function not implemented */

      所以排查到是链接的函数不对,应用程序中同时链接了libshared-glib.a和libshared-mainloop.a,最后取用的是libshared-glib.a,应该使用的是libshared-mainloop.a。
      
      **解决办法**
      
      在使用mainloop_add_fd函数的时候,要尤其注意,要链接使用正确的库。使用libshared-mainloop.a而不是libshared-glib.a和libshared-ell.a。
      1 条回复 最后回复 回复 引用 分享 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策