[libvirt] [PATCH] Initial work on the JNA port, still a work in progress
Daniel Veillard
veillard at redhat.com
Mon Jul 27 14:16:33 UTC 2009
On Sat, Jul 25, 2009 at 08:02:08AM -0400, Bryan Kearney wrote:
> ---
> src/org/libvirt/Connect.java | 336 +++++++++++++++++++---------------
> src/org/libvirt/Domain.java | 183 +++++++++++--------
> src/org/libvirt/Error.java | 21 ++
> src/org/libvirt/ErrorHandler.java | 22 +++
> src/org/libvirt/Network.java | 74 +++++---
> src/org/libvirt/NodeInfo.java | 16 ++
> src/org/libvirt/jna/Libvirt.java | 66 +++++++
> src/org/libvirt/jna/virError.java | 19 ++
> src/org/libvirt/jna/virNodeInfo.java | 19 ++
> src/test.java | 237 ++++++++++++------------
> 10 files changed, 630 insertions(+), 363 deletions(-)
> create mode 100644 src/org/libvirt/ErrorHandler.java
> create mode 100644 src/org/libvirt/jna/Libvirt.java
> create mode 100644 src/org/libvirt/jna/virError.java
> create mode 100644 src/org/libvirt/jna/virNodeInfo.java
>
> diff --git a/src/org/libvirt/Connect.java b/src/org/libvirt/Connect.java
[...]
> +import org.libvirt.jna.Libvirt;
> +import org.libvirt.jna.virError;
> +import org.libvirt.jna.virNodeInfo;
> +
> +import com.sun.jna.Native;
> +import com.sun.jna.Pointer;
> +import com.sun.jna.ptr.ByReference;
> +import com.sun.jna.ptr.LongByReference;
As said before that new dependancy should be fine
> /**
> * the native virConnectPtr.
> */
> - long VCP;
> + protected Pointer VCP;
that
> - private static native int _virInitialize();
and the removal of all the "private native" look a real improvement !
> diff --git a/src/org/libvirt/Error.java b/src/org/libvirt/Error.java
> index ef05702..ada7be8 100644
> --- a/src/org/libvirt/Error.java
> +++ b/src/org/libvirt/Error.java
> @@ -2,6 +2,8 @@ package org.libvirt;
>
> import java.io.Serializable;
>
> +import org.libvirt.jna.virError;
> +
> public class Error implements Serializable {
>
> public static enum ErrorDomain {
> @@ -308,6 +310,25 @@ public class Error implements Serializable {
> int int1;
> int int2;
> long VNP; /* Deprecated */
> +
> + public Error() {
> +
> + }
> +
> + public Error(virError vError) {
> + code = ErrorNumber.values()[vError.code] ;
> + domain = ErrorDomain.values()[vError.domain] ;
> + level = ErrorLevel.values()[vError.level] ;
> + message = vError.message ;
> + str1 = vError.str1 ;
> + str2 = vError.str2 ;
> + str3 = vError.str3 ;
> + int1 = vError.int1 ;
> + int2 = vError.int2 ;
> + VCP = vError.conn ;
> + VDP = vError.dom ;
> + VNP = vError.net ;
> + }
>
> /**
I think there are some cleanups needed w.r.t. spaces at end of lines
> +++ b/src/org/libvirt/ErrorHandler.java
> @@ -0,0 +1,22 @@
> +package org.libvirt;
> +
> +import org.libvirt.jna.Libvirt;
> +import org.libvirt.jna.virError;
> +
> +import com.sun.jna.Pointer;
> +
> +public class ErrorHandler implements Libvirt.virErrorFunc
> +{
> + public static ErrorHandler INSTANCE = new ErrorHandler() ;
> +
> + @Override
> + public void handleError(Pointer userData, virError vError) throws LibvirtException
> + {
> + System.out.println("Hello") ;
> + if (vError != null) {
> + Error error = new Error(vError) ;
> + throw new LibvirtException(error) ;
> + }
> +
> + }
> +}
That look rather simple
> diff --git a/src/org/libvirt/Network.java b/src/org/libvirt/Network.java
> index 6fda985..a194ca7 100644
> --- a/src/org/libvirt/Network.java
> +++ b/src/org/libvirt/Network.java
> @@ -1,15 +1,25 @@
> package org.libvirt;
>
> +import org.libvirt.jna.Libvirt;
> +
> +import com.sun.jna.Pointer;
> +
> public class Network {
>
> /**
> * The native virNetworkPtr
> */
> - private long VNP;
> + protected Pointer VNP;
For my own education, that means that subclasses implementations may
still use iit instead of keeping it fully private, right ?
> @@ -18,9 +28,10 @@ public class Network {
> * @param virConnect
> * @param VNP
> */
> - Network(Connect virConnect, long VNP){
> + Network(Connect virConnect, Pointer VNP){
> this.virConnect = virConnect;
> this.VNP = VNP;
> + this.libvirt = virConnect.libvirt ;
> }
I think we are slightly breaking the API here but in a way that should
be compatible with existing code, since VNP was returned from the
library, right ?
[...]
> diff --git a/src/org/libvirt/NodeInfo.java b/src/org/libvirt/NodeInfo.java
> index b7e2840..16855ca 100644
> --- a/src/org/libvirt/NodeInfo.java
> +++ b/src/org/libvirt/NodeInfo.java
> @@ -1,5 +1,7 @@
> package org.libvirt;
>
> +import org.libvirt.jna.virNodeInfo;
> +
> public class NodeInfo {
> /**
> * string indicating the CPU model
> @@ -34,6 +36,20 @@ public class NodeInfo {
> */
> public int threads;
>
> +
> + public NodeInfo() {
> + }
> +
> + public NodeInfo(virNodeInfo vInfo) {
> +// this.model = new String(vInfo.model) ;
err, why ?
> + this.memory = vInfo.memory.longValue() ;
> + this.cpus = vInfo.cpus ;
> + this.mhz = vInfo.mhz ;
> + this.nodes = vInfo.nodes ;
> + this.sockets = vInfo.sockets ;
> + this.cores = vInfo.cores ;
> + this.threads = vInfo.threads ;
> + }
> /**
> * @return the total number of CPUs supported but not neccessarily active in the host.
> */
> diff --git a/src/org/libvirt/jna/Libvirt.java b/src/org/libvirt/jna/Libvirt.java
> new file mode 100644
> index 0000000..1874d3e
> --- /dev/null
> +++ b/src/org/libvirt/jna/Libvirt.java
> @@ -0,0 +1,66 @@
> +package org.libvirt.jna;
> +
> +
> +import com.sun.jna.Callback;
> +import com.sun.jna.Library ;
> +import com.sun.jna.Native;
> +import com.sun.jna.Pointer;
> +import com.sun.jna.Structure.ByReference;
> +import com.sun.jna.ptr.LongByReference;
> +import com.sun.jna.ptr.PointerByReference;
> +
> +public interface Libvirt extends Library
> +{
> + Libvirt INSTANCE = (Libvirt) Native.loadLibrary("libvirt", Libvirt.class) ;
> +
> + //Callbacks
> + interface virErrorFunc extends Callback {
> + void handleError(Pointer userData, virError error) throws Exception ;
> + }
> +
> + // Global functions
> + public virError virGetLastError() ;
> + public int virGetVersion(LongByReference libVer, String type, LongByReference typeVer) ;
> + public int virInitialize() ;
> + public void virSetErrorFunc(long userData, virErrorFunc handler) ;
> +
> + //Connection Functions
> + public int virConnCopyLastError(Pointer virConnectPtr) ;
> + public int virConnectClose(Pointer virConnectPtr) ;
> + public String virConnectGetCapabilities(Pointer virConnectPtr) ;
> + public String virConnectGetHostname(Pointer virConnectPtr) ;
> + public virError virConnGetLastError(Pointer virConnectPtr) ;
> + public int virConnectGetMaxVcpus(Pointer virConnectPtr, String type) ;
> + public String virConnectGetType(Pointer virConnectPtr) ;
> + public String virConnectGetURI(Pointer virConnectPtr) ;
> + public int virConnectGetVersion(Pointer virConnectPtr, LongByReference hvVer) ;
> + public int virConnectListDomains(Pointer virConnectPtr, int[] ids, int maxnames) ;
> + public int virConnectListNetworks(Pointer virConnectPtr, String[] name, int maxnames) ;
> + public int virConnectListDefinedDomains(Pointer virConnectPtr, String[] name, int maxnames) ;
> + public int virConnectListDefinedNetworks(Pointer virConnectPtr, String[] name, int maxnames) ;
> + public int virConnectNumOfDomains(Pointer virConnectPtr) ;
> + public int virConnectNumOfDefinedDomains(Pointer virConnectPtr) ;
> + public int virConnectNumOfDefinedNetworks(Pointer virConnectPtr) ;
> + public int virConnectNumOfNetworks(Pointer virConnectPtr) ;
> + public Pointer virConnectOpen(String name) ;
> + public Pointer virConnectOpenReadOnly(String name) ;
> + public void virConnSetErrorFunc(Pointer virConnectPtr, long userData, virErrorFunc handler) ;
> +
> + // Node functions
> + public int virNodeGetInfo(Pointer virConnectPtr, virNodeInfo virNodeInfo) ;
> +
> + // Network functions
> + public Pointer virNetworkCreateXML(Pointer virConnectPtr, String xmlDesc) ;
> + public Pointer virNetworkDefineXML(Pointer virConnectPtr, String xmlDesc) ;
> + public String virNetworkGetName(Pointer virNetorkPtr) ;
> + public Pointer virNetworkLookupByName(Pointer virConnectPtr, String name) ;
> + public Pointer virNetworkLookupByUUIDString(Pointer virConnectPtr, String uuidstr) ;
> + public Pointer virNetworkLookupByUUID(Pointer virConnectPtr, String uuidstr) ;
> +
> + // Domain functions
> + public Pointer virDomainCreateLinux(Pointer virConnectPtr, String xmlDesc, int flags) ;
> + public Pointer virDomainCreateXML(Pointer virConnectPtr, String xmlDesc, int flags) ;
> + public Pointer virDomainDefineXML(Pointer virConnectPtr, String xmlDesc) ;
> + public Pointer virDomainLookupByUUIDString(Pointer virConnectPtr, String uuidstr) ;
> +
> +}
That's refreshingly simple !!!
> diff --git a/src/org/libvirt/jna/virError.java b/src/org/libvirt/jna/virError.java
> new file mode 100644
> index 0000000..db462fa
> --- /dev/null
> +++ b/src/org/libvirt/jna/virError.java
> @@ -0,0 +1,19 @@
> +package org.libvirt.jna;
> +
> +import com.sun.jna.Structure ;
> +
> +public class virError extends Structure
> +{
> + public int code ;
> + public int domain ;
> + public String message ;
> + public int level ;
> + public long conn ;
> + public long dom ;
> + public String str1 ;
> + public String str2 ;
> + public String str3 ;
> + public int int1 ;
> + public int int2 ;
> + public long net ;
> +}
same here
> diff --git a/src/org/libvirt/jna/virNodeInfo.java b/src/org/libvirt/jna/virNodeInfo.java
> new file mode 100644
> index 0000000..5a6449e
> --- /dev/null
> +++ b/src/org/libvirt/jna/virNodeInfo.java
> @@ -0,0 +1,19 @@
> +package org.libvirt.jna;
> +
> +import com.sun.jna.NativeLong;
> +import com.sun.jna.Structure;
> +
> +public class virNodeInfo extends Structure
> +{
> + public class ByValue extends virNodeInfo implements Structure.ByValue {};
> + public class ByReference extends virNodeInfo implements Structure.ByReference {};
> +
> + public byte model[] = new byte[32];
> + public NativeLong memory ;
> + public int cpus ;
> + public int mhz ;
> + public int nodes ;
> + public int sockets ;
> + public int cores ;
> + public int threads ;
> +}
and here
> \ No newline at end of file
Should be fixed, only one though !
It would be great to trick your editor into showing extra spaces at the
end of lines.
> diff --git a/src/test.java b/src/test.java
> index 73f4eb7..2ca6a92 100644
> --- a/src/test.java
> +++ b/src/test.java
> @@ -18,20 +18,21 @@ public class test {
> Integer.decode("0xf0"), Integer.decode("0x3c"), Integer.decode("0x87"), Integer.decode("0xd2"), Integer.decode("0x1e"), Integer.decode("0x69")} ;
>
I just hope that at the end of the patch series the test file is back
to its original state. Maybe not worth fixing in all intermediary
steps ...
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list