xenstore watch机制

xs_read_watch 会读走相应的信息,xs_daemon_open相当于打开一个socket链接,触发watch时,有几个链接,就发几份信息。

同一个链接,同一份信息只能被读一次,第二次读不到就会卡住。

 

社区新引入了一个回调机制:
struct libxl__ev_xswatch {
    /* caller should include this in their own struct */
    /* read-only for caller, who may read only when registered: */
    char *path;
    libxl__ev_xswatch_callback *callback;
    /* remainder is private for libxl__ev_xswatch... */
    int slotnum; /* registered iff slotnum >= 0 */
    uint32_t counterval;
};
libxl_cdrom_insert
libxl_device_disk_remove
    libxl__initiate_device_remove
        libxl__device_destroy_tapdisk
        libxl__ev_devstate_init
           libxl__ev_devstate_wait
              libxl__ev_time_register_rel
libxl__ev_xswatch_register
    watchfd_callback
        xs_check_watch(CTX->xsh);
char **xs_check_watch(struct xs_handle *h)
{
 unsigned int num;
 char **ret;
 ret = read_watch_internal(h, &num, 1);
 if (ret) assert(num >= 2);
 return ret;
}

virDrvOpenStatus
xenStoreOpen(virConnectPtr conn,
             virConnectAuthPtr auth ATTRIBUTE_UNUSED,
             unsigned int flags)
{
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;

    if (flags & VIR_CONNECT_RO)
        priv->xshandle = xs_daemon_open_readonly();
    else
        priv->xshandle = xs_daemon_open();

    /* This will get called once at start */
    if ( xenStoreAddWatch(conn, "@releaseDomain",
                     "releaseDomain", xenStoreDomainReleased, priv) < 0 )
    {
        virXenStoreError(VIR_ERR_INTERNAL_ERROR,
                         "%s", _("adding watch @releaseDomain"));
        return -1;
    }

    /* The initial call of this will fill domInfoList */
    if( xenStoreAddWatch(conn, "@introduceDomain",
                     "introduceDomain", xenStoreDomainIntroduced, priv) < 0 )
    {
        virXenStoreError(VIR_ERR_INTERNAL_ERROR,
                         "%s", _("adding watch @introduceDomain"));
        return -1;
    }

static void
xenStoreWatchEvent(int watch ATTRIBUTE_UNUSED,
                   int fd ATTRIBUTE_UNUSED,
                   int events,
                   void *data)
{
    xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;

    event = xs_read_watch(priv->xshandle, &stringCount);

 

xenUnifiedOpen –> xenStoreOpen

 

libxlVmStart -> libxlCreateDomEvents -> libxl_get_event-> xs_read_watch


main -> daemonStateInit -> daemonRunStateInit ->virStateInitialize ->libxlStartup -> libxl_ctx_init

 

2013年5月23日上传

猜你喜欢

转载自blog.csdn.net/tdaajames/article/details/107519283