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日上传