Create wrapper functions for each events C API that accepts a virErrorPtr parameter. This avoids accessing a thread local from a goroutine which may race with other goroutines doing native API calls in the same OS thread. Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> --- domain_events.go | 131 ++++++++++++++++++++------------- domain_events_wrapper.go | 33 +++++++-- domain_events_wrapper.h | 7 +- events.go | 40 +++++++--- events_wrapper.go | 83 ++++++++++++++++++--- events_wrapper.h | 35 ++++++--- network_events.go | 11 ++- network_events_wrapper.go | 26 +++++-- network_events_wrapper.h | 13 +--- node_device_events.go | 16 ++-- node_device_events_wrapper.go | 31 ++++++-- node_device_events_wrapper.h | 6 +- secret_events.go | 16 ++-- secret_events_wrapper.go | 27 +++++-- secret_events_wrapper.h | 6 +- storage_pool_events.go | 16 ++-- storage_pool_events_wrapper.go | 31 ++++++-- storage_pool_events_wrapper.h | 6 +- 18 files changed, 382 insertions(+), 152 deletions(-) diff --git a/domain_events.go b/domain_events.go index 68dc301..fe46c5e 100644 --- a/domain_events.go +++ b/domain_events.go @@ -966,13 +966,14 @@ func (c *Connect) DomainEventLifecycleRegister(dom *Domain, callback DomainEvent if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_LIFECYCLE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -985,13 +986,14 @@ func (c *Connect) DomainEventRebootRegister(dom *Domain, callback DomainEventGen if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_REBOOT, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1004,13 +1006,14 @@ func (c *Connect) DomainEventRTCChangeRegister(dom *Domain, callback DomainEvent if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_RTC_CHANGE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1023,13 +1026,14 @@ func (c *Connect) DomainEventWatchdogRegister(dom *Domain, callback DomainEventW if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_WATCHDOG, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1042,13 +1046,14 @@ func (c *Connect) DomainEventIOErrorRegister(dom *Domain, callback DomainEventIO if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_IO_ERROR, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1061,13 +1066,14 @@ func (c *Connect) DomainEventGraphicsRegister(dom *Domain, callback DomainEventG if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_GRAPHICS, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1080,13 +1086,14 @@ func (c *Connect) DomainEventIOErrorReasonRegister(dom *Domain, callback DomainE if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1099,13 +1106,14 @@ func (c *Connect) DomainEventControlErrorRegister(dom *Domain, callback DomainEv if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_CONTROL_ERROR, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1118,13 +1126,14 @@ func (c *Connect) DomainEventBlockJobRegister(dom *Domain, callback DomainEventB if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_BLOCK_JOB, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1137,13 +1146,14 @@ func (c *Connect) DomainEventDiskChangeRegister(dom *Domain, callback DomainEven if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1156,13 +1166,14 @@ func (c *Connect) DomainEventTrayChangeRegister(dom *Domain, callback DomainEven if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_TRAY_CHANGE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1175,13 +1186,14 @@ func (c *Connect) DomainEventPMWakeupRegister(dom *Domain, callback DomainEventP if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_PMWAKEUP, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1194,13 +1206,14 @@ func (c *Connect) DomainEventPMSuspendRegister(dom *Domain, callback DomainEvent if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_PMSUSPEND, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1213,13 +1226,14 @@ func (c *Connect) DomainEventBalloonChangeRegister(dom *Domain, callback DomainE if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1232,13 +1246,14 @@ func (c *Connect) DomainEventPMSuspendDiskRegister(dom *Domain, callback DomainE if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1251,13 +1266,14 @@ func (c *Connect) DomainEventDeviceRemovedRegister(dom *Domain, callback DomainE if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1270,13 +1286,14 @@ func (c *Connect) DomainEventBlockJob2Register(dom *Domain, callback DomainEvent if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1289,13 +1306,14 @@ func (c *Connect) DomainEventTunableRegister(dom *Domain, callback DomainEventTu if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_TUNABLE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1308,13 +1326,14 @@ func (c *Connect) DomainEventAgentLifecycleRegister(dom *Domain, callback Domain if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1327,13 +1346,14 @@ func (c *Connect) DomainEventDeviceAddedRegister(dom *Domain, callback DomainEve if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1346,13 +1366,14 @@ func (c *Connect) DomainEventMigrationIterationRegister(dom *Domain, callback Do if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1365,13 +1386,14 @@ func (c *Connect) DomainEventJobCompletedRegister(dom *Domain, callback DomainEv if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_JOB_COMPLETED, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1384,13 +1406,14 @@ func (c *Connect) DomainEventDeviceRemovalFailedRegister(dom *Domain, callback D if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1403,13 +1426,14 @@ func (c *Connect) DomainEventMetadataChangeRegister(dom *Domain, callback Domain if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_METADATA_CHANGE, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -1422,21 +1446,24 @@ func (c *Connect) DomainEventBlockThresholdRegister(dom *Domain, callback Domain if dom != nil { cdom = dom.ptr } + var err C.virError ret := C.virConnectDomainEventRegisterAnyWrapper(c.ptr, cdom, C.VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD, C.virConnectDomainEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } func (c *Connect) DomainEventDeregister(callbackId int) error { // Deregister the callback - if i := int(C.virConnectDomainEventDeregisterAny(c.ptr, C.int(callbackId))); i != 0 { - return GetLastError() + var err C.virError + ret := int(C.virConnectDomainEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err)) + if ret < 0 { + return makeError(&err) } return nil } diff --git a/domain_events_wrapper.go b/domain_events_wrapper.go index 07b9418..5d74fee 100644 --- a/domain_events_wrapper.go +++ b/domain_events_wrapper.go @@ -225,12 +225,35 @@ void domainEventBlockThresholdCallbackHelper(virConnectPtr conn, domainEventBlockThresholdCallback(conn, dom, dev, path, threshold, excess, (int)(intptr_t)opaque); } -int virConnectDomainEventRegisterAnyWrapper(virConnectPtr c, virDomainPtr d, - int eventID, virConnectDomainEventGenericCallback cb, - long goCallbackId) { - void* id = (void*)goCallbackId; - return virConnectDomainEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); +int +virConnectDomainEventRegisterAnyWrapper(virConnectPtr c, + virDomainPtr d, + int eventID, + virConnectDomainEventGenericCallback cb, + long goCallbackId, + virErrorPtr err) +{ + void *id = (void*)goCallbackId; + int ret = virConnectDomainEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virConnectDomainEventDeregisterAnyWrapper(virConnectPtr conn, + int callbackID, + virErrorPtr err) +{ + int ret = virConnectDomainEventDeregisterAny(conn, callbackID); + if (ret < 0) { + virCopyLastError(err); + } + return ret; } + */ import "C" diff --git a/domain_events_wrapper.h b/domain_events_wrapper.h index 4016497..1670acd 100644 --- a/domain_events_wrapper.h +++ b/domain_events_wrapper.h @@ -196,7 +196,12 @@ virConnectDomainEventRegisterAnyWrapper(virConnectPtr c, virDomainPtr d, int eventID, virConnectDomainEventGenericCallback cb, - long goCallbackId); + long goCallbackId, + virErrorPtr err); +int +virConnectDomainEventDeregisterAnyWrapper(virConnectPtr conn, + int callbackID, + virErrorPtr err); #endif /* LIBVIRT_GO_DOMAIN_EVENTS_WRAPPER_H__ */ diff --git a/events.go b/events.go index 217b033..bf2c1f4 100644 --- a/events.go +++ b/events.go @@ -44,16 +44,18 @@ const ( // See also https://libvirt.org/html/libvirt-libvirt-event.html#virEventRegisterDefaultImpl func EventRegisterDefaultImpl() error { - if i := int(C.virEventRegisterDefaultImpl()); i != 0 { - return GetLastError() + var err C.virError + if i := int(C.virEventRegisterDefaultImplWrapper(&err)); i != 0 { + return makeError(&err) } return nil } // See also https://libvirt.org/html/libvirt-libvirt-event.html#virEventRunDefaultImpl func EventRunDefaultImpl() error { - if i := int(C.virEventRunDefaultImpl()); i != 0 { - return GetLastError() + var err C.virError + if i := int(C.virEventRunDefaultImplWrapper(&err)); i != 0 { + return makeError(&err) } return nil } @@ -76,9 +78,10 @@ func eventHandleCallback(watch int, fd int, events int, callbackID int) { func EventAddHandle(fd int, events EventHandleType, callback EventHandleCallback) (int, error) { callbackID := registerCallbackId(callback) - ret := C.virEventAddHandleWrapper((C.int)(fd), (C.int)(events), (C.int)(callbackID)) + var err C.virError + ret := C.virEventAddHandleWrapper((C.int)(fd), (C.int)(events), (C.int)(callbackID), &err) if ret == -1 { - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil @@ -90,8 +93,14 @@ func EventUpdateHandle(watch int, events EventHandleType) { } // See also https://libvirt.org/html/libvirt-libvirt-event.html#virEventRemoveHandle -func EventRemoveHandle(watch int) { - C.virEventRemoveHandle((C.int)(watch)) +func EventRemoveHandle(watch int) error { + var err C.virError + ret := C.virEventRemoveHandleWrapper((C.int)(watch), &err) + if ret < 0 { + return makeError(&err) + } + + return nil } type EventTimeoutCallback func(timer int) @@ -112,9 +121,10 @@ func eventTimeoutCallback(timer int, callbackID int) { func EventAddTimeout(freq int, callback EventTimeoutCallback) (int, error) { callbackID := registerCallbackId(callback) - ret := C.virEventAddTimeoutWrapper((C.int)(freq), (C.int)(callbackID)) + var err C.virError + ret := C.virEventAddTimeoutWrapper((C.int)(freq), (C.int)(callbackID), &err) if ret == -1 { - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil @@ -126,8 +136,14 @@ func EventUpdateTimeout(timer int, freq int) { } // See also https://libvirt.org/html/libvirt-libvirt-event.html#virEventRemoveTimeout -func EventRemoveTimeout(timer int) { - C.virEventRemoveTimeout((C.int)(timer)) +func EventRemoveTimeout(timer int) error { + var err C.virError + ret := C.virEventRemoveTimeoutWrapper((C.int)(timer), &err) + if ret < 0 { + return makeError(&err) + } + + return nil } type EventHandleCallbackInfo struct { diff --git a/events_wrapper.go b/events_wrapper.go index ffcffb9..6814589 100644 --- a/events_wrapper.go +++ b/events_wrapper.go @@ -39,11 +39,6 @@ static void eventAddHandleHelper(int watch, int fd, int events, void *opaque) eventHandleCallback(watch, fd, events, (int)(intptr_t)opaque); } -int virEventAddHandleWrapper(int fd, int events, int callbackID) -{ - return virEventAddHandle(fd, events, eventAddHandleHelper, (void *)(intptr_t)callbackID, NULL); -} - void eventTimeoutCallback(int timer, int callbackID); static void eventAddTimeoutHelper(int timer, void *opaque) @@ -51,11 +46,6 @@ static void eventAddTimeoutHelper(int timer, void *opaque) eventTimeoutCallback(timer, (int)(intptr_t)opaque); } -int virEventAddTimeoutWrapper(int freq, int callbackID) -{ - return virEventAddTimeout(freq, eventAddTimeoutHelper, (void *)(intptr_t)callbackID, NULL); -} - int eventAddHandleFunc(int fd, int event, uintptr_t callback, uintptr_t opaque, uintptr_t freecb); void eventUpdateHandleFunc(int watch, int event); int eventRemoveHandleFunc(int watch); @@ -126,5 +116,78 @@ void eventTimeoutCallbackFree(uintptr_t callback, uintptr_t opaque) } +int +virEventAddHandleWrapper(int fd, + int events, + int callbackID, + virErrorPtr err) +{ + int ret = virEventAddHandle(fd, events, eventAddHandleHelper, (void *)(intptr_t)callbackID, NULL); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virEventAddTimeoutWrapper(int timeout, + int callbackID, + virErrorPtr err) +{ + int ret = virEventAddTimeout(timeout, eventAddTimeoutHelper, (void *)(intptr_t)callbackID, NULL); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virEventRegisterDefaultImplWrapper(virErrorPtr err) +{ + int ret = virEventRegisterDefaultImpl(); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virEventRemoveHandleWrapper(int watch, + virErrorPtr err) +{ + int ret = virEventRemoveHandle(watch); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virEventRemoveTimeoutWrapper(int timer, + virErrorPtr err) +{ + int ret = virEventRemoveTimeout(timer); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virEventRunDefaultImplWrapper(virErrorPtr err) +{ + int ret = virEventRunDefaultImpl(); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + */ import "C" diff --git a/events_wrapper.h b/events_wrapper.h index 9e9607c..62ea9c8 100644 --- a/events_wrapper.h +++ b/events_wrapper.h @@ -30,15 +30,6 @@ #include <libvirt/libvirt.h> #include <libvirt/virterror.h> -int -virEventAddHandleWrapper(int fd, - int events, - int callbackID); - -int -virEventAddTimeoutWrapper(int freq, - int callbackID); - void virEventRegisterImplWrapper(void); @@ -62,4 +53,30 @@ void eventTimeoutCallbackFree(uintptr_t callback, uintptr_t opaque); +int +virEventAddHandleWrapper(int fd, + int events, + int callbackID, + virErrorPtr err); + +int +virEventAddTimeoutWrapper(int timeout, + int callbackID, + virErrorPtr err); + +int +virEventRegisterDefaultImplWrapper(virErrorPtr err); + +int +virEventRemoveHandleWrapper(int watch, + virErrorPtr err); + +int +virEventRemoveTimeoutWrapper(int timer, + virErrorPtr err); + +int +virEventRunDefaultImplWrapper(virErrorPtr err); + + #endif /* LIBVIRT_GO_EVENTS_WRAPPER_H__ */ diff --git a/network_events.go b/network_events.go index 7414608..8ed16d9 100644 --- a/network_events.go +++ b/network_events.go @@ -77,13 +77,14 @@ func (c *Connect) NetworkEventLifecycleRegister(net *Network, callback NetworkEv if net != nil { cnet = net.ptr } + var err C.virError ret := C.virConnectNetworkEventRegisterAnyWrapper(c.ptr, cnet, C.VIR_NETWORK_EVENT_ID_LIFECYCLE, C.virConnectNetworkEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -93,8 +94,10 @@ func (c *Connect) NetworkEventDeregister(callbackId int) error { return GetNotImplementedError("virConnectNetworkEventDeregisterAny") } // Deregister the callback - if i := int(C.virConnectNetworkEventDeregisterAnyWrapper(c.ptr, C.int(callbackId))); i != 0 { - return GetLastError() + var err C.virError + ret := int(C.virConnectNetworkEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err)) + if ret < 0 { + return makeError(&err) } return nil } diff --git a/network_events_wrapper.go b/network_events_wrapper.go index a8a5d81..4e424ba 100644 --- a/network_events_wrapper.go +++ b/network_events_wrapper.go @@ -40,24 +40,38 @@ void networkEventLifecycleCallbackHelper(virConnectPtr c, virNetworkPtr d, networkEventLifecycleCallback(c, d, event, detail, (int)(intptr_t)data); } -int virConnectNetworkEventRegisterAnyWrapper(virConnectPtr c, virNetworkPtr d, - int eventID, virConnectNetworkEventGenericCallback cb, - long goCallbackId) { +int +virConnectNetworkEventRegisterAnyWrapper(virConnectPtr c, + virNetworkPtr d, + int eventID, + virConnectNetworkEventGenericCallback cb, + long goCallbackId, + virErrorPtr err) +{ void* id = (void*)goCallbackId; #if LIBVIR_VERSION_NUMBER < 1002001 assert(0); // Caller should have checked version #else - return virConnectNetworkEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + int ret = virConnectNetworkEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } int virConnectNetworkEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID) + int callbackID, + virErrorPtr err) { #if LIBVIR_VERSION_NUMBER < 1002001 assert(0); // Caller should have checked version #else - return virConnectNetworkEventDeregisterAny(conn, callbackID); + int ret = virConnectNetworkEventDeregisterAny(conn, callbackID); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } diff --git a/network_events_wrapper.h b/network_events_wrapper.h index 201be64..789837a 100644 --- a/network_events_wrapper.h +++ b/network_events_wrapper.h @@ -43,18 +43,13 @@ virConnectNetworkEventRegisterAnyWrapper(virConnectPtr c, virNetworkPtr d, int eventID, virConnectNetworkEventGenericCallback cb, - long goCallbackId); - -int -virConnectNetworkEventRegisterAnyWrapper(virConnectPtr c, - virNetworkPtr d, - int eventID, - virConnectNetworkEventGenericCallback cb, - long goCallbackId); + long goCallbackId, + virErrorPtr err); int virConnectNetworkEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID); + int callbackID, + virErrorPtr err); #endif /* LIBVIRT_GO_NETWORK_EVENTS_WRAPPER_H__ */ diff --git a/node_device_events.go b/node_device_events.go index 5d66687..632c94d 100644 --- a/node_device_events.go +++ b/node_device_events.go @@ -94,13 +94,14 @@ func (c *Connect) NodeDeviceEventLifecycleRegister(device *NodeDevice, callback if device != nil { cdevice = device.ptr } + var err C.virError ret := C.virConnectNodeDeviceEventRegisterAnyWrapper(c.ptr, cdevice, C.VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE, C.virConnectNodeDeviceEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -113,13 +114,14 @@ func (c *Connect) NodeDeviceEventUpdateRegister(device *NodeDevice, callback Nod if device != nil { cdevice = device.ptr } + var err C.virError ret := C.virConnectNodeDeviceEventRegisterAnyWrapper(c.ptr, cdevice, C.VIR_NODE_DEVICE_EVENT_ID_UPDATE, C.virConnectNodeDeviceEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -129,8 +131,10 @@ func (c *Connect) NodeDeviceEventDeregister(callbackId int) error { return GetNotImplementedError("virConnectNodeDeviceEventDeregisterAny") } // Deregister the callback - if i := int(C.virConnectNodeDeviceEventDeregisterAnyWrapper(c.ptr, C.int(callbackId))); i != 0 { - return GetLastError() + var err C.virError + ret := int(C.virConnectNodeDeviceEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err)) + if ret < 0 { + return makeError(&err) } return nil } diff --git a/node_device_events_wrapper.go b/node_device_events_wrapper.go index a8b0c93..8b2e624 100644 --- a/node_device_events_wrapper.go +++ b/node_device_events_wrapper.go @@ -46,24 +46,41 @@ void nodeDeviceEventGenericCallbackHelper(virConnectPtr c, virNodeDevicePtr d, v nodeDeviceEventGenericCallback(c, d, (int)(intptr_t)data); } -int virConnectNodeDeviceEventRegisterAnyWrapper(virConnectPtr c, virNodeDevicePtr d, - int eventID, virConnectNodeDeviceEventGenericCallback cb, - long goCallbackId) { + +int +virConnectNodeDeviceEventRegisterAnyWrapper(virConnectPtr c, + virNodeDevicePtr d, + int eventID, + virConnectNodeDeviceEventGenericCallback cb, + long goCallbackId, + virErrorPtr err) +{ void* id = (void*)goCallbackId; #if LIBVIR_VERSION_NUMBER < 2002000 assert(0); // Caller should have checked version #else - return virConnectNodeDeviceEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + int ret = virConnectNodeDeviceEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } -int virConnectNodeDeviceEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID) + +int +virConnectNodeDeviceEventDeregisterAnyWrapper(virConnectPtr conn, + int callbackID, + virErrorPtr err) { #if LIBVIR_VERSION_NUMBER < 2002000 assert(0); // Caller should have checked version #else - return virConnectNodeDeviceEventDeregisterAny(conn, callbackID); + int ret = virConnectNodeDeviceEventDeregisterAny(conn, callbackID); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } diff --git a/node_device_events_wrapper.h b/node_device_events_wrapper.h index a3d014d..fb691d2 100644 --- a/node_device_events_wrapper.h +++ b/node_device_events_wrapper.h @@ -48,11 +48,13 @@ virConnectNodeDeviceEventRegisterAnyWrapper(virConnectPtr c, virNodeDevicePtr d, int eventID, virConnectNodeDeviceEventGenericCallback cb, - long goCallbackId); + long goCallbackId, + virErrorPtr err); int virConnectNodeDeviceEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID); + int callbackID, + virErrorPtr err); #endif /* LIBVIRT_GO_NODE_DEVICE_EVENTS_WRAPPER_H__ */ diff --git a/secret_events.go b/secret_events.go index d24146f..38605ba 100644 --- a/secret_events.go +++ b/secret_events.go @@ -94,13 +94,14 @@ func (c *Connect) SecretEventLifecycleRegister(secret *Secret, callback SecretEv if secret != nil { csecret = secret.ptr } + var err C.virError ret := C.virConnectSecretEventRegisterAnyWrapper(c.ptr, csecret, C.VIR_SECRET_EVENT_ID_LIFECYCLE, C.virConnectSecretEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -116,13 +117,14 @@ func (c *Connect) SecretEventValueChangedRegister(secret *Secret, callback Secre if secret != nil { csecret = secret.ptr } + var err C.virError ret := C.virConnectSecretEventRegisterAnyWrapper(c.ptr, csecret, C.VIR_SECRET_EVENT_ID_VALUE_CHANGED, C.virConnectSecretEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -132,8 +134,10 @@ func (c *Connect) SecretEventDeregister(callbackId int) error { return GetNotImplementedError("virConnectSecretEventDeregisterAny") } // Deregister the callback - if i := int(C.virConnectSecretEventDeregisterAnyWrapper(c.ptr, C.int(callbackId))); i != 0 { - return GetLastError() + var err C.virError + ret := int(C.virConnectSecretEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err)) + if ret < 0 { + return makeError(&err) } return nil } diff --git a/secret_events_wrapper.go b/secret_events_wrapper.go index 04b5f4f..a543e7f 100644 --- a/secret_events_wrapper.go +++ b/secret_events_wrapper.go @@ -47,24 +47,39 @@ void secretEventGenericCallbackHelper(virConnectPtr c, virSecretPtr d, secretEventGenericCallback(c, d, (int)(intptr_t)data); } -int virConnectSecretEventRegisterAnyWrapper(virConnectPtr c, virSecretPtr d, - int eventID, virConnectSecretEventGenericCallback cb, - long goCallbackId) { + +int +virConnectSecretEventRegisterAnyWrapper(virConnectPtr c, + virSecretPtr d, + int eventID, + virConnectSecretEventGenericCallback cb, + long goCallbackId, + virErrorPtr err) +{ void* id = (void*)goCallbackId; #if LIBVIR_VERSION_NUMBER < 3000000 assert(0); // Caller should have checked version #else - return virConnectSecretEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + int ret = virConnectSecretEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } int virConnectSecretEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID) + int callbackID, + virErrorPtr err) { #if LIBVIR_VERSION_NUMBER < 3000000 assert(0); // Caller should have checked version #else - return virConnectSecretEventDeregisterAny(conn, callbackID); + int ret = virConnectSecretEventDeregisterAny(conn, callbackID); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } diff --git a/secret_events_wrapper.h b/secret_events_wrapper.h index bf1c571..5101bc0 100644 --- a/secret_events_wrapper.h +++ b/secret_events_wrapper.h @@ -47,10 +47,12 @@ virConnectSecretEventRegisterAnyWrapper(virConnectPtr c, virSecretPtr d, int eventID, virConnectSecretEventGenericCallback cb, - long goCallbackId); + long goCallbackId, + virErrorPtr err); int virConnectSecretEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID); + int callbackID, + virErrorPtr err); #endif /* LIBVIRT_GO_SECRET_EVENTS_WRAPPER_H__ */ diff --git a/storage_pool_events.go b/storage_pool_events.go index 15fb90b..55c9f4e 100644 --- a/storage_pool_events.go +++ b/storage_pool_events.go @@ -95,13 +95,14 @@ func (c *Connect) StoragePoolEventLifecycleRegister(pool *StoragePool, callback if pool != nil { cpool = pool.ptr } + var err C.virError ret := C.virConnectStoragePoolEventRegisterAnyWrapper(c.ptr, cpool, C.VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, C.virConnectStoragePoolEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -118,13 +119,14 @@ func (c *Connect) StoragePoolEventRefreshRegister(pool *StoragePool, callback St if pool != nil { cpool = pool.ptr } + var err C.virError ret := C.virConnectStoragePoolEventRegisterAnyWrapper(c.ptr, cpool, C.VIR_STORAGE_POOL_EVENT_ID_REFRESH, C.virConnectStoragePoolEventGenericCallback(callbackPtr), - C.long(goCallBackId)) + C.long(goCallBackId), &err) if ret == -1 { freeCallbackId(goCallBackId) - return 0, GetLastError() + return 0, makeError(&err) } return int(ret), nil } @@ -135,8 +137,10 @@ func (c *Connect) StoragePoolEventDeregister(callbackId int) error { } // Deregister the callback - if i := int(C.virConnectStoragePoolEventDeregisterAnyWrapper(c.ptr, C.int(callbackId))); i != 0 { - return GetLastError() + var err C.virError + ret := int(C.virConnectStoragePoolEventDeregisterAnyWrapper(c.ptr, C.int(callbackId), &err)) + if ret < 0 { + return makeError(&err) } return nil } diff --git a/storage_pool_events_wrapper.go b/storage_pool_events_wrapper.go index df9b092..c551038 100644 --- a/storage_pool_events_wrapper.go +++ b/storage_pool_events_wrapper.go @@ -47,24 +47,41 @@ void storagePoolEventGenericCallbackHelper(virConnectPtr c, virStoragePoolPtr d, storagePoolEventGenericCallback(c, d, (int)(intptr_t)data); } -int virConnectStoragePoolEventRegisterAnyWrapper(virConnectPtr c, virStoragePoolPtr d, - int eventID, virConnectStoragePoolEventGenericCallback cb, - long goCallbackId) { + +int +virConnectStoragePoolEventRegisterAnyWrapper(virConnectPtr c, + virStoragePoolPtr d, + int eventID, + virConnectStoragePoolEventGenericCallback cb, + long goCallbackId, + virErrorPtr err) +{ #if LIBVIR_VERSION_NUMBER < 2000000 assert(0); // Caller should have checked version #else void* id = (void*)goCallbackId; - return virConnectStoragePoolEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + int ret = virConnectStoragePoolEventRegisterAny(c, d, eventID, cb, id, freeGoCallbackHelper); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } -int virConnectStoragePoolEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID) + +int +virConnectStoragePoolEventDeregisterAnyWrapper(virConnectPtr conn, + int callbackID, + virErrorPtr err) { #if LIBVIR_VERSION_NUMBER < 2000000 assert(0); // Caller shouuld have checked version #else - return virConnectStoragePoolEventDeregisterAny(conn, callbackID); + int ret = virConnectStoragePoolEventDeregisterAny(conn, callbackID); + if (ret < 0) { + virCopyLastError(err); + } + return ret; #endif } diff --git a/storage_pool_events_wrapper.h b/storage_pool_events_wrapper.h index 84dcc8f..7007f1c 100644 --- a/storage_pool_events_wrapper.h +++ b/storage_pool_events_wrapper.h @@ -48,10 +48,12 @@ virConnectStoragePoolEventRegisterAnyWrapper(virConnectPtr c, virStoragePoolPtr d, int eventID, virConnectStoragePoolEventGenericCallback cb, - long goCallbackId); + long goCallbackId, + virErrorPtr err); int virConnectStoragePoolEventDeregisterAnyWrapper(virConnectPtr conn, - int callbackID); + int callbackID, + virErrorPtr err); #endif /* LIBVIRT_GO_STORAGE_POOL_EVENTS_WRAPPER_H__ */ -- 2.17.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list