Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15529244
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-06-29 19:49:17

gboolean
hald_dbus_local_server_init (void)
{
    gboolean ret;
    DBusError error;

    ret = FALSE;

    /* setup a server listening on a socket so we can do point to point
     * connections for programs spawned by hald
     */

    dbus_error_init (&error);
    // 因为HALD_DBUS_ADDRESS定义为
    // #define HALD_DBUS_ADDRESS "unix:tmpdir=/var/run/hald"
    // 所以目录地址为/var/run/hald/ unix类型文件名由_dbus_server_listen_platform_specific
    // 自动产生,格式为"dbus-随机的10字节字符"
    // unix:abstract=/var/run/hald/dbus-FcEU3mweOz,guid=74ef46b3436f7d00fd802ba84a489a0d
    if ((local_server = dbus_server_listen (HALD_DBUS_ADDRESS, &error)) == NULL) {
        HAL_ERROR (("Cannot create D-BUS server"));
        goto out;
    }
    local_server_address = dbus_server_get_address (local_server);
    HAL_INFO (("local server is listening at %s", local_server_address));
    // 设置dbus-server对应的add_watch和add_timeout回调函数,将connection上的watches链表上的watch单元
    //
g_io_create_watch==>unix_channel_funcs.g_io_unix_create_watch,设置回调函数为io_handler_dispatch()将connection上的watches链表上的timeout单元
    // 添加到ConnectionSetup即cs的->timeouts链表上设置回调函数为timeout_handler_dispatch[luther.gliethttp].
    // 而local_server将监听HALD_DBUS_ADDRESS,即:"unix:tmpdir=/var/run/hald",当发现有人连接该unix文件时,
    // 回调函数io_handler_dispatch()调用socket_handle_watch()==>handle_new_client_fd_and_unlock()建立该用户发起的连接.
    dbus_server_setup_with_g_main (local_server, NULL); // 将local_server添件到g_main_context_default()返回的默认context上
    // 当有新的connection被添加时将调用local_server_handle_connection回调函数处理该connection连接,
    // 重新设置该connection的vtable虚函数表,然后调用dbus_connection_setup_with_g_main (new_connection, NULL);
    // 设置该connection的watch_functions为add_watch,同时将connection上的watches链表上的watch单元
    //
g_io_create_watch==>unix_channel_funcs.g_io_unix_create_watch,将该connection在
    // _dbus_transport_set_connection()==>socket_connection_set()中产生的transport监控的read_watch和write_watch,
    // 添加到transport->connection,即在handle_new_client_fd_and_unlock()中刚刚创建的connection->watches链表上,
    // read_watch和write_watch当发生数据流动时,
    // 将触发io_handler_dispatch==>_dbus_connection_handle_watch()回调函数[luther.gliethttp].
    dbus_server_set_new_connection_function (local_server, local_server_handle_connection, NULL, NULL);    

    ret = TRUE;

out:
    return ret;
}

阅读(2126) | 评论(0) | 转发(0) |
0

上一篇:hald启动完全log

下一篇:unix文件通信

给主人留下些什么吧!~~