WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: [PATCH 4 of 4] libxl: add an Enumeration type to the IDL

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] Re: [PATCH 4 of 4] libxl: add an Enumeration type to the IDL, use it for all enums
From: Ian Campbell <Ian.Campbell@xxxxxxxxxxxxx>
Date: Thu, 31 Mar 2011 12:42:59 +0100
Delivery-date: Thu, 31 Mar 2011 04:46:29 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <acb800c269780d7c69dc.1301571493@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Organization: Citrix Systems, Inc.
References: <patchbomb.1301571489@xxxxxxxxxxxxxxxxxxxxx> <acb800c269780d7c69dc.1301571493@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
I forgot to qrefresh a last minute change (autogen the typedef enum FOO
{ } FOO syntax) into this version please use the following instead.

# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1301571721 -3600
# Node ID a3b5c15e1f8b4abca3db2457cafe719fa26348b8
# Parent  6a72a608fe9e8d3639038697fcea0197c59156fe
libxl: add an Enumeration type to the IDL, use it for all enums

The IDL requires a specific value for each enumerate, this make it
much easier to avoid (or at least track) ABI changes since they must
now be explicit.

I believe I have used the same values as would have been chosen
previoulsy but have not confirmed.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py   Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/libxl/gentypes.py   Thu Mar 31 12:42:01 2011 +0100
@@ -34,7 +34,28 @@ def libxl_C_instance_of(ty, instancename
 
 def libxl_C_type_define(ty, indent = ""):
     s = ""
-    if isinstance(ty, libxltypes.Aggregate):
+
+    if isinstance(ty, libxltypes.Enumeration):
+        if ty.comment is not None:
+            s += format_comment(0, ty.comment)
+        
+        if ty.typename is None:
+            s += "enum {\n"
+        else:
+            s += "typedef enum %s {\n" % ty.typename
+
+        for v in ty.values:
+            if v.comment is not None:
+                s += format_comment(4, v.comment)
+            x = "%s = %d" % (v.name, v.value)
+            x = x.replace("\n", "\n    ")
+            s += "    " + x + ",\n"
+        if ty.typename is None:
+            s += "}"
+        else:
+            s += "} %s" % ty.typename
+
+    elif isinstance(ty, libxltypes.Aggregate):
         if ty.comment is not None:
             s += format_comment(0, ty.comment)
 
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/libxl/libxl.h       Thu Mar 31 12:42:01 2011 +0100
@@ -161,42 +161,6 @@ typedef struct {
 #define LIBXL_CPUARRAY_INVALID_ENTRY  ~0
 void libxl_cpuarray_destroy(libxl_cpuarray *array);
 
-typedef enum {
-    LIBXL_QEMU_MACHINE_TYPE_FV = 1,
-    LIBXL_QEMU_MACHINE_TYPE_PV,
-} libxl_qemu_machine_type;
-
-typedef enum {
-    LIBXL_CONSOLE_TYPE_SERIAL = 1,
-    LIBXL_CONSOLE_TYPE_PV,
-} libxl_console_type;
-
-typedef enum {
-    LIBXL_CONSOLE_BACKEND_XENCONSOLED,
-    LIBXL_CONSOLE_BACKEND_IOEMU,
-} libxl_console_backend;
-
-typedef enum {
-    LIBXL_DISK_FORMAT_UNKNOWN = 0,
-    LIBXL_DISK_FORMAT_QCOW,
-    LIBXL_DISK_FORMAT_QCOW2,
-    LIBXL_DISK_FORMAT_VHD,
-    LIBXL_DISK_FORMAT_RAW,
-    LIBXL_DISK_FORMAT_EMPTY,
-} libxl_disk_format;
-
-typedef enum {
-    LIBXL_DISK_BACKEND_UNKNOWN = 0,
-    LIBXL_DISK_BACKEND_PHY,
-    LIBXL_DISK_BACKEND_TAP,
-    LIBXL_DISK_BACKEND_QDISK,
-} libxl_disk_backend;
-
-typedef enum {
-    LIBXL_NIC_TYPE_IOEMU = 1,
-    LIBXL_NIC_TYPE_VIF,
-} libxl_nic_type;
-
 typedef struct {
     /*
      * Path is always set if the file reference is valid. However if
@@ -245,18 +209,6 @@ enum {
 
 #define LIBXL_VERSION 0
 
-typedef enum libxl_action_on_shutdown {
-    LIBXL_ACTION_ON_SHUTDOWN_DESTROY,
-
-    LIBXL_ACTION_ON_SHUTDOWN_RESTART,
-    LIBXL_ACTION_ON_SHUTDOWN_RESTART_RENAME,
-
-    LIBXL_ACTION_ON_SHUTDOWN_PRESERVE,
-
-    LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_DESTROY,
-    LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART,
-} libxl_action_on_shutdown;
-
 typedef struct {
     libxl_domain_create_info c_info;
     libxl_domain_build_info b_info;
@@ -321,11 +273,6 @@ int libxl_run_bootloader(libxl_ctx *ctx,
 
 /* events handling */
 
-typedef enum {
-    LIBXL_EVENT_TYPE_DOMAIN_DEATH,
-    LIBXL_EVENT_TYPE_DISK_EJECT,
-} libxl_event_type;
-
 typedef struct {
     /* event type */
     libxl_event_type type;
@@ -486,11 +433,6 @@ int libxl_userdata_retrieve(libxl_ctx *c
    * On error return, *data_r and *datalen_r are undefined.
    */
 
-typedef enum {
-    LIBXL_BUTTON_POWER,
-    LIBXL_BUTTON_SLEEP
-} libxl_button;
-
 int libxl_button_press(libxl_ctx *ctx, uint32_t domid, libxl_button button);
 
 int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo);
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/libxl/libxl.idl
--- a/tools/libxl/libxl.idl     Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/libxl/libxl.idl     Thu Mar 31 12:42:01 2011 +0100
@@ -8,12 +8,6 @@ libxl_uuid = Builtin("uuid")
 libxl_mac = Builtin("mac")
 libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", 
passby=PASS_BY_REFERENCE)
 libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", 
passby=PASS_BY_REFERENCE)
-libxl_qemu_machine_type = Number("qemu_machine_type", namespace="libxl_")
-libxl_console_backend = Number("console_backend", namespace="libxl_")
-libxl_console_type = Number("console_type", namespace="libxl_")
-libxl_disk_format = Number("disk_format", namespace="libxl_")
-libxl_disk_backend = Number("disk_backend", namespace="libxl_")
-libxl_nic_type = Number("nic_type", namespace="libxl_")
 libxl_cpuid_policy_list = Builtin("cpuid_policy_list", 
destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE)
 
 libxl_string_list = Builtin("string_list", 
destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE)
@@ -23,6 +17,68 @@ libxl_file_reference = Builtin("file_ref
 libxl_hwcap = Builtin("hwcap")
 
 #
+# Constants / Enumerations
+#
+
+libxl_qemu_machine_type = Enumeration("qemu_machine_type", [
+    (1, "FV"),
+    (2, "PV"),
+    ])
+
+libxl_console_type = Enumeration("console_type", [
+    (1, "SERIAL"),
+    (2, "PV"),
+    ])
+
+libxl_console_backend = Enumeration("console_backend", [
+    (1, "XENCONSOLED"),
+    (2, "IOEMU"),
+    ])
+
+libxl_disk_format = Enumeration("disk_format", [
+    (0, "UNKNOWN"),
+    (1, "QCOW"),
+    (2, "QCOW2"),
+    (3, "VHD"),
+    (4, "RAW"),
+    (5, "EMPTY"),
+    ])
+
+libxl_disk_backend = Enumeration("disk_backend", [
+    (0, "UNKNOWN"),
+    (1, "PHY"),
+    (2, "TAP"),
+    (3, "QDISK"),
+    ])
+
+libxl_nic_type = Enumeration("nic_type", [
+    (1, "IOEMU"),
+    (2, "VIF"),
+    ])
+
+libxl_action_on_shutdown = Enumeration("action_on_shutdown", [
+    (1, "DESTROY"),
+
+    (2, "RESTART"),
+    (3, "RESTART_RENAME"),
+
+    (4, "PRESERVE"),
+
+    (5, "COREDUMP_DESTROY"),
+    (6, "COREDUMP_RESTART"),
+    ])
+
+libxl_event_type = Enumeration("event_type", [
+    (1, "DOMAIN_DEATH"),
+    (2, "DISK_EJECT"),
+    ])
+
+libxl_button = Enumeration("button", [
+    (1, "POWER"),
+    (2, "SLEEP"),
+    ])
+
+#
 # Complex libxl types
 #
 libxl_dominfo = Struct("dominfo",[
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/libxl/libxltypes.py Thu Mar 31 12:42:01 2011 +0100
@@ -52,6 +52,37 @@ class UInt(Number):
 
         self.width = w
 
+class EnumerationValue(object):
+    def __init__(self, value, name, **kwargs):
+        kwargs.setdefault("namespace", None)
+        kwargs.setdefault("typename", None)
+
+        if kwargs["typename"]:
+            name = kwargs["typename"] + "_" + name
+
+        self.typename = kwargs["typename"]
+        self.rawname = str.upper(name)
+         
+        if kwargs["namespace"]:
+             name = kwargs["namespace"] + name
+        
+        self.name = str.upper(name)
+        
+        self.value = value
+        self.comment = kwargs.setdefault("comment", None)
+        
+class Enumeration(Type):
+    def __init__(self, typename, values, **kwargs):
+        kwargs.setdefault('destructor_fn', None)
+        Type.__init__(self, typename, **kwargs)
+
+        self.values = []
+        for v in values:
+            (num,name) = v
+            self.values.append(EnumerationValue(num, name,
+                                                namespace=self.namespace,
+                                                typename=self.rawname))
+        
 class BitField(Type):
     def __init__(self, ty, w, **kwargs):
         kwargs.setdefault('namespace', None)
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Thu Mar 31 12:42:01 2011 +0100
@@ -450,6 +450,8 @@ static int parse_action_on_shutdown(cons
     for (i = 0; i < sizeof(action_on_shutdown_names) / 
sizeof(action_on_shutdown_names[0]); i++) {
         n = action_on_shutdown_names[i];
 
+        if (!n) continue;
+
         if (strcmp(buf, n) == 0) {
             *a = i;
             return 1;
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/python/genwrap.py
--- a/tools/python/genwrap.py   Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/python/genwrap.py   Thu Mar 31 12:42:01 2011 +0100
@@ -9,6 +9,8 @@ import libxltypes
 def py_type(ty):
     if ty == libxltypes.bool or isinstance(ty, libxltypes.BitField) and 
ty.width == 1:
         return TYPE_BOOL
+    if isinstance(ty, libxltypes.Enumeration):
+        return TYPE_UINT
     if isinstance(ty, libxltypes.Number):
         if ty.signed:
             return TYPE_INT
@@ -34,15 +36,16 @@ def fsanitize(name):
 
 def py_decls(ty):
     l = []
-    l.append('_hidden Py_%s *Py%s_New(void);\n'%(ty.rawname, ty.rawname))
-    l.append('_hidden int Py%s_Check(PyObject *self);\n'%ty.rawname)
-    for f in ty.fields:
-        if py_type(f.type) is not None:
-            continue
-        l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
-                 fsanitize(f.type.typename), f.type.typename, f.name))
-        l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
-                 fsanitize(f.type.typename), f.type.typename, f.name))
+    if isinstance(ty, libxltypes.Aggregate):
+        l.append('_hidden Py_%s *Py%s_New(void);\n'%(ty.rawname, ty.rawname))
+        l.append('_hidden int Py%s_Check(PyObject *self);\n'%ty.rawname)
+        for f in ty.fields:
+            if py_type(f.type) is not None:
+                continue
+            l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
+                fsanitize(f.type.typename), f.type.typename, f.name))
+            l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
+                fsanitize(f.type.typename), f.type.typename, f.name))
     return '\n'.join(l) + "\n"
 
 def py_attrib_get(ty, f):
@@ -189,16 +192,23 @@ def py_initfuncs(types):
     l.append('void genwrap__init(PyObject *m)')
     l.append('{')
     for ty in types:
-        l.append('    if (PyType_Ready(&Py%s_Type) >= 0) {'%ty.rawname)
-        l.append('        Py_INCREF(&Py%s_Type);'%ty.rawname)
-        l.append('        PyModule_AddObject(m, "%s", (PyObject 
*)&Py%s_Type);'%(ty.rawname, ty.rawname))
-        l.append('    }')
+        if isinstance(ty, libxltypes.Enumeration):
+            for v in ty.values:
+                l.append('    PyModule_AddIntConstant(m, "%s", %s);' % 
(v.rawname, v.name))
+        elif isinstance(ty, libxltypes.Aggregate):
+            l.append('    if (PyType_Ready(&Py%s_Type) >= 0) {'%ty.rawname)
+            l.append('        Py_INCREF(&Py%s_Type);'%ty.rawname)
+            l.append('        PyModule_AddObject(m, "%s", (PyObject 
*)&Py%s_Type);'%(ty.rawname, ty.rawname))
+            l.append('    }')
+        else:
+            raise NotImplementedError("unknown type %s (%s)" % (ty.typename, 
type(ty)))        
+
     l.append('}')
     return '\n'.join(l) + "\n\n"
 
 def tree_frob(types):
     ret = types[:]
-    for ty in ret:
+    for ty in [ty for ty in ret if isinstance(ty, libxltypes.Aggregate)]:
         ty.fields = filter(lambda f:f.name is not None and f.type.typename is 
not None, ty.fields)
     return ret
 
@@ -249,8 +259,8 @@ _hidden PyObject *genwrap__ll_get(long l
 _hidden int genwrap__ll_set(PyObject *v, long long *val, long long mask);
 
 """ % " ".join(sys.argv))
-    for ty in types:
-        f.write('/* Internal APU for %s wrapper */\n'%ty.typename)
+    for ty in [ty for ty in types if isinstance(ty, libxltypes.Aggregate)]:
+        f.write('/* Internal API for %s wrapper */\n'%ty.typename)
         f.write(py_wrapstruct(ty))
         f.write(py_decls(ty))
         f.write('\n')
@@ -276,10 +286,11 @@ _hidden int genwrap__ll_set(PyObject *v,
 
 """ % tuple((' '.join(sys.argv),) + (os.path.split(decls)[-1:]),))
     for ty in types:
-        f.write('/* Attribute get/set functions for %s */\n'%ty.typename)
-        for a in ty.fields:
-            f.write(py_attrib_get(ty,a))
-            f.write(py_attrib_set(ty,a))
-        f.write(py_object_def(ty))
+        if isinstance(ty, libxltypes.Aggregate):
+            f.write('/* Attribute get/set functions for %s */\n'%ty.typename)
+            for a in ty.fields:
+                f.write(py_attrib_get(ty,a))
+                f.write(py_attrib_set(ty,a))
+            f.write(py_object_def(ty))
     f.write(py_initfuncs(types))
     f.close()
diff -r 6a72a608fe9e -r a3b5c15e1f8b tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c Thu Mar 31 12:33:54 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c Thu Mar 31 12:42:01 2011 +0100
@@ -769,35 +769,6 @@ PyMODINIT_FUNC initxl(void)
     _INT_CONST(m, SHUTDOWN_crash);
     _INT_CONST(m, SHUTDOWN_watchdog);
 
-    _INT_CONST_LIBXL(m, QEMU_MACHINE_TYPE_FV);
-    _INT_CONST_LIBXL(m, QEMU_MACHINE_TYPE_PV);
-
-    _INT_CONST_LIBXL(m, CONSOLE_TYPE_SERIAL);
-    _INT_CONST_LIBXL(m, CONSOLE_TYPE_PV);
-
-    _INT_CONST_LIBXL(m, CONSOLE_BACKEND_XENCONSOLED);
-    _INT_CONST_LIBXL(m, CONSOLE_BACKEND_IOEMU);
-
-    _INT_CONST_LIBXL(m, DISK_FORMAT_UNKNOWN);
-    _INT_CONST_LIBXL(m, DISK_FORMAT_QCOW);
-    _INT_CONST_LIBXL(m, DISK_FORMAT_QCOW2);
-    _INT_CONST_LIBXL(m, DISK_FORMAT_VHD);
-    _INT_CONST_LIBXL(m, DISK_FORMAT_RAW);
-    _INT_CONST_LIBXL(m, DISK_FORMAT_EMPTY);
-
-    _INT_CONST_LIBXL(m, DISK_BACKEND_UNKNOWN);
-    _INT_CONST_LIBXL(m, DISK_BACKEND_PHY);
-    _INT_CONST_LIBXL(m, DISK_BACKEND_TAP);
-    _INT_CONST_LIBXL(m, DISK_BACKEND_QDISK);
-
-    _INT_CONST_LIBXL(m, NIC_TYPE_IOEMU);
-    _INT_CONST_LIBXL(m, NIC_TYPE_VIF);
-
-    _INT_CONST_LIBXL(m, EVENT_TYPE_DOMAIN_DEATH);
-    _INT_CONST_LIBXL(m, EVENT_TYPE_DISK_EJECT);
-
-    _INT_CONST_LIBXL(m, BUTTON_POWER);
-    _INT_CONST_LIBXL(m, BUTTON_SLEEP);
     genwrap__init(m);
 }
 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel