# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1300975212 0
# Node ID f279e605ac9e90686ad98e4877aed84a3f34d0bf
# Parent dd172a4ee31058f1e108c8e5411ab7734bbddc6b
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 dd172a4ee310 -r f279e605ac9e tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/libxl/gentypes.py Thu Mar 24 14:00:12 2011 +0000
@@ -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 {\n"
+
+ 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 dd172a4ee310 -r f279e605ac9e tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/libxl/libxl.h Thu Mar 24 14:00:12 2011 +0000
@@ -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
@@ -244,18 +208,6 @@ enum {
};
#define LIBXL_VERSION 0
-
-typedef enum {
- 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;
@@ -320,11 +272,6 @@ int libxl_run_bootloader(libxl_ctx *ctx,
/* 0 means ERROR_ENOMEM, which we have logged */
/* events handling */
-
-typedef enum {
- LIBXL_EVENT_TYPE_DOMAIN_DEATH,
- LIBXL_EVENT_TYPE_DISK_EJECT,
-} libxl_event_type;
typedef struct {
/* event 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 dd172a4ee310 -r f279e605ac9e tools/libxl/libxl.idl
--- a/tools/libxl/libxl.idl Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/libxl/libxl.idl Thu Mar 24 14:00:12 2011 +0000
@@ -8,12 +8,6 @@ libxl_mac = Builtin("mac")
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)
@@ -21,6 +15,68 @@ libxl_file_reference = Builtin("file_ref
libxl_file_reference = Builtin("file_reference",
destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE)
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
diff -r dd172a4ee310 -r f279e605ac9e tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/libxl/libxltypes.py Thu Mar 24 14:00:12 2011 +0000
@@ -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 dd172a4ee310 -r f279e605ac9e tools/python/genwrap.py
--- a/tools/python/genwrap.py Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/python/genwrap.py Thu Mar 24 14:00:12 2011 +0000
@@ -9,6 +9,8 @@ def py_type(ty):
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 int genwrap__ll_set(PyObject *v,
_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 dd172a4ee310 -r f279e605ac9e tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c Thu Mar 24 12:20:49 2011 +0000
+++ b/tools/python/xen/lowlevel/xl/xl.c Thu Mar 24 14:00:12 2011 +0000
@@ -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
|