[libvirt] [PATCH 0/2] Libvirt-java event handling

From: Julian Stecklina <jsteckli@os.inf.tu-dresden.de> I noticed that event handling in the libvirt Java bindings is incomplete. The first patch adds required data types and constants. The second relaxes the visibility of the Domain constructor, otherwise Callbacks are kind of useless. Regards, Julian Julian Stecklina (2): Allow different types of callbacks (just as the C API). Allow to construct Domain objects from inside callbacks. src/main/java/org/libvirt/Connect.java | 3 ++- src/main/java/org/libvirt/Domain.java | 2 +- src/main/java/org/libvirt/jna/Libvirt.java | 22 ++++++++++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) -- 1.7.3.4

From: Julian Stecklina <jsteckli@os.inf.tu-dresden.de> --- src/main/java/org/libvirt/Connect.java | 3 ++- src/main/java/org/libvirt/jna/Libvirt.java | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/libvirt/Connect.java b/src/main/java/org/libvirt/Connect.java index 7761c1f..dd52774 100644 --- a/src/main/java/org/libvirt/Connect.java +++ b/src/main/java/org/libvirt/Connect.java @@ -19,6 +19,7 @@ import org.libvirt.jna.virNodeInfo; import com.sun.jna.Memory; import com.sun.jna.NativeLong; import com.sun.jna.ptr.LongByReference; +import com.sun.jna.Callback; /** * The Connect object represents a connection to a local or remote @@ -409,7 +410,7 @@ public class Connect { * identifier for the callback. -1 if an error * @throws LibvirtException */ - public int domainEventRegisterAny(Domain domain, int eventId, Libvirt.VirConnectDomainEventGenericCallback cb) + public int domainEventRegisterAny(Domain domain, int eventId, Callback cb) throws LibvirtException { DomainPointer ptr = domain == null ? null : domain.VDP; int returnValue = libvirt.virConnectDomainEventRegisterAny(VCP, ptr, eventId, cb, null, null); diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 2c8c03d..ec277c9 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -96,6 +96,14 @@ public interface Libvirt extends Library { public void eventCallback(ConnectionPointer virConnectPtr, DomainPointer virDomainPointer, Pointer opaque) ; } + interface VirConnectDomainEventCallback extends Callback { + public void eventCallback(ConnectionPointer virConnectPtr, DomainPointer virDomainPointer, int event, int detail, Pointer opaque); + } + + interface VirConnectDomainEventRTCChangeCallback extends Callback { + public void eventCallback(ConnectionPointer virConnectPtr, DomainPointer virDomainPointer, long utcoffset, Pointer opaque); + } + Libvirt INSTANCE = (Libvirt) Native.loadLibrary("virt", Libvirt.class); // Constants we need @@ -108,7 +116,7 @@ public interface Libvirt extends Library { public int virConnCopyLastError(ConnectionPointer virConnectPtr, virError to); public int virConnectClose(ConnectionPointer virConnectPtr); public int virConnectCompareCPU(ConnectionPointer virConnectPtr, String xmlDesc, int flags); - public int virConnectDomainEventRegisterAny(ConnectionPointer virConnectPtr, DomainPointer virDomainPtr, int eventID, Libvirt.VirConnectDomainEventGenericCallback cb, Pointer opaque, Libvirt.VirFreeCallback freecb); + public int virConnectDomainEventRegisterAny(ConnectionPointer virConnectPtr, DomainPointer virDomainPtr, int eventID, Callback cb, Pointer opaque, Libvirt.VirFreeCallback freecb); public int virConnectDomainEventDeregisterAny(ConnectionPointer virConnectPtr, int callbackID) ; public void virConnSetErrorFunc(ConnectionPointer virConnectPtr, Pointer userData, VirErrorCallback callback); public int virConnectIsEncrypted(ConnectionPointer virConnectPtr) ; @@ -157,7 +165,17 @@ public interface Libvirt extends Library { public int virCopyLastError(virError error); public virError virGetLastError(); public void virResetLastError(); - public void virSetErrorFunc(Pointer userData, VirErrorCallback callback); + public void virSetErrorFunc(Pointer userData, VirErrorCallback callback); + + // Domain constants + static final int VIR_DOMAIN_EVENT_ID_LIFECYCLE = 0; // virConnectDomainEventCallback + static final int VIR_DOMAIN_EVENT_ID_REBOOT = 1; // virConnectDomainEventGenericCallback + static final int VIR_DOMAIN_EVENT_ID_RTC_CHANGE = 2; // virConnectDomainEventRTCChangeCallback + static final int VIR_DOMAIN_EVENT_ID_WATCHDOG = 3; // virConnectDomainEventWatchdogCallback + static final int VIR_DOMAIN_EVENT_ID_IO_ERROR = 4; // virConnectDomainEventIOErrorCallback + static final int VIR_DOMAIN_EVENT_ID_GRAPHICS = 5; // virConnectDomainEventGraphicsCallback + static final int VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON = 6; // virConnectDomainEventIOErrorReasonCallback + static final int VIR_DOMAIN_EVENT_ID_CONTROL_ERROR = 7; // virConnectDomainEventGenericCallback // Domain functions public int virDomainAbortJob(DomainPointer virDomainPtr); -- 1.7.3.4

From: Julian Stecklina <jsteckli@os.inf.tu-dresden.de> --- src/main/java/org/libvirt/Domain.java | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index 3b0298b..f84c420 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -67,7 +67,7 @@ public class Domain { * @param VDP * the native virDomainPtr */ - Domain(Connect virConnect, DomainPointer VDP) { + public Domain(Connect virConnect, DomainPointer VDP) { this.virConnect = virConnect; this.VDP = VDP; libvirt = virConnect.libvirt; -- 1.7.3.4

On 07/25/2011 02:25 PM, js@alien8.de wrote:
From: Julian Stecklina<jsteckli@os.inf.tu-dresden.de>
I noticed that event handling in the libvirt Java bindings is incomplete. The first patch adds required data types and constants. The second relaxes the visibility of the Domain constructor, otherwise Callbacks are kind of useless.
Regards, Julian
Julian Stecklina (2): Allow different types of callbacks (just as the C API). Allow to construct Domain objects from inside callbacks.
src/main/java/org/libvirt/Connect.java | 3 ++- src/main/java/org/libvirt/Domain.java | 2 +- src/main/java/org/libvirt/jna/Libvirt.java | 22 ++++++++++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-)
Thank you for the patch. I am applying it now. Did you get the registration call backes working. I am getting failures consistently with every domain registration I do with the callbacks. -- bk

Thus spake Bryan Kearney <bkearney@redhat.com>:
Thank you for the patch. I am applying it now. Did you get the registration call backes working. I am getting failures consistently with every domain registration I do with the callbacks.
I think most drivers don't support that. We have a custom driver for our hypervisor and it works. The only weird thing is the following. Suppose I have a callback like this: @Override public void eventCallback(ConnectionPointer virConnectPtr, DomainPointer virDomainPointer, Pointer arg4) { System.out.printf("p %s\n", virDomainPointer.toString()); Domain d = new Domain(c, virDomainPointer); try { System.out.printf("REBOOT(%s)\n", d.getName()); } catch (LibvirtException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Sometimes I get the following output: p org.libvirt.jna.DomainPointer@c016a2b8 libvir: Domain error : invalid domain pointer in virDomainFree REBOOT(linux) I am at a loss to explain where this call to virDomainFree comes from... Any clues? Regards, Julian
participants (3)
-
Bryan Kearney
-
js@alien8.de
-
Julian Stecklina