提交 4f5326c3 编写于 作者: D Daniel P. Berrange

Add APIs to allow management of callbacks purely with virDomainEventState

While virDomainEventState has APIs for managing removal of callbacks,
while locked, adding callbacks in the first place requires direct
access to the virDomainEventCallbackList structure. This is not
threadsafe since it is bypassing the virDomainEventState locks

* src/conf/domain_event.c, src/conf/domain_event.h,
  src/libvirt_private.syms: Add APIs for managing callbacks
  via virDomainEventState.
上级 d09f6ba5
......@@ -1342,9 +1342,71 @@ virDomainEventStateFlush(virDomainEventStatePtr state,
/**
* virDomainEventStateDeregister:
* virDomainEventStateRegister:
* @conn: connection to associate with callback
* @state: domain event state
* @callback: function to remove from event
* @opaque: data blob to pass to callback
* @freecb: callback to free @opaque
*
* Register the function @callback with connection @conn,
* from @state, for lifecycle events.
*
* Returns: the number of lifecycle callbacks now registered, or -1 on error
*/
int virDomainEventStateRegister(virConnectPtr conn,
virDomainEventStatePtr state,
virConnectDomainEventCallback callback,
void *opaque,
virFreeCallback freecb)
{
int ret;
virDomainEventStateLock(state);
ret = virDomainEventCallbackListAdd(conn, state->callbacks,
callback, opaque, freecb);
virDomainEventStateUnlock(state);
return ret;
}
/**
* virDomainEventStateRegisterID:
* @conn: connection to associate with callback
* @state: domain event state
* @eventID: ID of the event type to register for
* @cb: function to remove from event
* @opaque: data blob to pass to callback
* @freecb: callback to free @opaque
* @callbackID: filled with callback ID
*
* Register the function @callbackID with connection @conn,
* from @state, for events of type @eventID.
*
* Returns: the number of callbacks now registered, or -1 on error
*/
int virDomainEventStateRegisterID(virConnectPtr conn,
virDomainEventStatePtr state,
virDomainPtr dom,
int eventID,
virConnectDomainEventGenericCallback cb,
void *opaque,
virFreeCallback freecb,
int *callbackID)
{
int ret;
virDomainEventStateLock(state);
ret = virDomainEventCallbackListAddID(conn, state->callbacks,
dom, eventID, cb, opaque, freecb,
callbackID);
virDomainEventStateUnlock(state);
return ret;
}
/**
* virDomainEventStateDeregister:
* @conn: connection to associate with callback
* @state: domain event state
* @callback: function to remove from event
*
* Unregister the function @callback with connection @conn,
......@@ -1372,8 +1434,8 @@ virDomainEventStateDeregister(virConnectPtr conn,
/**
* virDomainEventStateDeregisterID:
* @state: domain event state
* @conn: connection to associate with callback
* @state: domain event state
* @callbackID: ID of the function to remove from event
*
* Unregister the function @callbackID with connection @conn,
......@@ -1398,3 +1460,51 @@ virDomainEventStateDeregisterID(virConnectPtr conn,
virDomainEventStateUnlock(state);
return ret;
}
/**
* virDomainEventStateDeregisterConn:
* @conn: connection to associate with callbacks
* @state: domain event state
*
* Remove all callbacks from @state associated with the
* connection @conn
*
* Returns 0 on success, -1 on error
*/
int
virDomainEventStateDeregisterConn(virConnectPtr conn,
virDomainEventStatePtr state)
{
int ret;
virDomainEventStateLock(state);
ret = virDomainEventCallbackListRemoveConn(conn, state->callbacks);
virDomainEventStateUnlock(state);
return ret;
}
/**
* virDomainEventStateEventID:
* @conn: connection associated with the callback
* @state: domain event state
* @callbackID: the callback to query
*
* Query what event ID type is associated with the
* callback @callbackID for connection @conn
*
* Returns 0 on success, -1 on error
*/
int
virDomainEventStateEventID(virConnectPtr conn,
virDomainEventStatePtr state,
int callbackID)
{
int ret;
virDomainEventStateLock(state);
ret = virDomainEventCallbackListEventID(conn,
state->callbacks, callbackID);
virDomainEventStateUnlock(state);
return ret;
}
......@@ -237,6 +237,21 @@ virDomainEventStateFlush(virDomainEventStatePtr state,
virDomainEventDispatchFunc dispatchFunc,
void *opaque)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int virDomainEventStateRegister(virConnectPtr conn,
virDomainEventStatePtr state,
virConnectDomainEventCallback callback,
void *opaque,
virFreeCallback freecb)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
int virDomainEventStateRegisterID(virConnectPtr conn,
virDomainEventStatePtr state,
virDomainPtr dom,
int eventID,
virConnectDomainEventGenericCallback cb,
void *opaque,
virFreeCallback freecb,
int *callbackID)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5);
int
virDomainEventStateDeregister(virConnectPtr conn,
virDomainEventStatePtr state,
......@@ -247,5 +262,14 @@ virDomainEventStateDeregisterID(virConnectPtr conn,
virDomainEventStatePtr state,
int callbackID)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int
virDomainEventStateDeregisterConn(virConnectPtr conn,
virDomainEventStatePtr state)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int
virDomainEventStateEventID(virConnectPtr conn,
virDomainEventStatePtr state,
int callbackID)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
#endif
......@@ -512,6 +512,10 @@ virDomainEventRebootNewFromDom;
virDomainEventRebootNewFromObj;
virDomainEventStateDeregister;
virDomainEventStateDeregisterID;
virDomainEventStateDeregisterConn;
virDomainEventStateEventID;
virDomainEventStateRegister;
virDomainEventStateRegisterID;
virDomainEventStateFlush;
virDomainEventStateFree;
virDomainEventStateNew;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册