[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] Expose exception thrown by xen.lowlevel.xs (Was Re: [PATCH] Expose exception thrown by xen.lowlevel.xc)
Ewan Mellor wrote: On Fri, May 19, 2006 at 11:16:41AM -0500, Anthony Liguori wrote:The attached patch exposes the exception thrown by xen.lowlevel.xc as the type xen.lowlevel.xc.Error which is an exception that inherits from RuntimeError.I only had a few minutes this morning so I didn't get to xen.lowlevel.xs but hopefully someone else can use this as a guide on what needs to be done. If noone else gets to it, I'll be able to submit another one in about a week.I've only done very basic testing but I don't expect that this should break anything...Thanks Anthony -- applied. Got a little more time than I expected to. This one's quite a bit more invasive but I think it's needed to at least be consistent with xen.lowlevel.xc. I don't think we should be tossing an exception with different formats (sometimes we threw a RuntimeError with (errno, msg) and other times just a string--I've changed it to always be (errno, msg)). Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> Regards, Anthony Liguori Ewan. # HG changeset patch # User Anthony Liguori <anthony@xxxxxxxxxxxxx> # Node ID 6d7dee5a1f2b6552e41578e3a8fcf5eb804f66ab # Parent 352f6cc97066af5a50906a2c4b47794434a7cc30 Expose the exception thrown by xen.lowlevel.xs. diff -r 352f6cc97066 -r 6d7dee5a1f2b tools/python/xen/lowlevel/xs/xs.c --- a/tools/python/xen/lowlevel/xs/xs.c Fri May 19 11:13:28 2006 -0500 +++ b/tools/python/xen/lowlevel/xs/xs.c Fri May 19 11:32:21 2006 -0500 @@ -28,6 +28,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> +#include <errno.h> #include <xenctrl.h> #include "xs.h" @@ -43,6 +44,8 @@ #define PKG "xen.lowlevel.xs" #define CLS "xs" + +static PyObject *xs_error; /** Python wrapper round an xs handle. */ @@ -52,11 +55,17 @@ typedef struct XsHandle { PyObject *watches; } XsHandle; +static void xs_set_error(int value) +{ + errno = value; + PyErr_SetFromErrno(xs_error); +} + static inline struct xs_handle *xshandle(XsHandle *self) { struct xs_handle *xh = self->xh; if (!xh) - PyErr_SetString(PyExc_RuntimeError, "invalid xenstore daemon handle"); + xs_set_error(EINVAL); return xh; } @@ -77,7 +86,7 @@ static int parse_transaction_path(XsHand "\n" \ "Returns: [string] data read.\n" \ " None if key doesn't exist.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_read(XsHandle *self, PyObject *args) @@ -113,7 +122,7 @@ static PyObject *xspy_read(XsHandle *sel " data [string] : data to write.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_write(XsHandle *self, PyObject *args) @@ -149,7 +158,7 @@ static PyObject *xspy_write(XsHandle *se "\n" \ "Returns: [string array] list of subdirectory names.\n" \ " None if key doesn't exist.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_ls(XsHandle *self, PyObject *args) @@ -187,7 +196,7 @@ static PyObject *xspy_ls(XsHandle *self, " path [string]: path to directory to create.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_mkdir(XsHandle *self, PyObject *args) @@ -215,7 +224,7 @@ static PyObject *xspy_mkdir(XsHandle *se " path [string] : path to remove\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_rm(XsHandle *self, PyObject *args) @@ -243,7 +252,7 @@ static PyObject *xspy_rm(XsHandle *self, " path [string]: xenstore path.\n" \ "\n" \ "Returns: permissions array.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_get_permissions(XsHandle *self, PyObject *args) @@ -284,7 +293,7 @@ static PyObject *xspy_get_permissions(Xs return val; } else { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); return NULL; } } @@ -296,7 +305,7 @@ static PyObject *xspy_get_permissions(Xs " perms : permissions.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_set_permissions(XsHandle *self, PyObject *args) @@ -323,13 +332,13 @@ static PyObject *xspy_set_permissions(Xs th = strtoul(thstr, NULL, 16); if (!PyList_Check(perms)) { - PyErr_SetString(PyExc_RuntimeError, "perms must be a list"); + xs_set_error(EINVAL); goto exit; } xsperms_n = PyList_Size(perms); xsperms = calloc(xsperms_n, sizeof(struct xs_permissions)); if (!xsperms) { - PyErr_SetString(PyExc_RuntimeError, "out of memory"); + xs_set_error(ENOMEM); goto exit; } tuple0 = PyTuple_New(0); @@ -351,7 +360,7 @@ static PyObject *xspy_set_permissions(Xs result = xs_set_permissions(xh, th, path, xsperms, xsperms_n); Py_END_ALLOW_THREADS if (!result) { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); goto exit; } @@ -370,7 +379,7 @@ static PyObject *xspy_set_permissions(Xs " token [string] : returned in watch notification.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" /* Each 10 bits takes ~ 3 digits, plus one, plus one for nul terminator. */ @@ -420,7 +429,7 @@ static PyObject *xspy_watch(XsHandle *se "Read a watch notification.\n" \ "\n" \ "Returns: [tuple] (path, token).\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_read_watch(XsHandle *self, PyObject *args) @@ -440,11 +449,11 @@ again: xsval = xs_read_watch(xh, &num); Py_END_ALLOW_THREADS if (!xsval) { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); goto exit; } if (sscanf(xsval[XS_WATCH_TOKEN], "%li", (unsigned long *)&token) != 1) { - PyErr_SetString(PyExc_RuntimeError, "invalid token"); + xs_set_error(EINVAL); goto exit; } for (i = 0; i < PyList_Size(self->watches); i++) { @@ -473,7 +482,7 @@ again: " token [string] : token from the watch.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_unwatch(XsHandle *self, PyObject *args) @@ -503,7 +512,7 @@ static PyObject *xspy_unwatch(XsHandle * "Start a transaction.\n" \ "\n" \ "Returns transaction handle on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_transaction_start(XsHandle *self) @@ -520,7 +529,7 @@ static PyObject *xspy_transaction_start( Py_END_ALLOW_THREADS if (th == XBT_NULL) { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); return NULL; } @@ -534,7 +543,7 @@ static PyObject *xspy_transaction_start( " abort [int]: abort flag (default 0).\n" \ "\n" \ "Returns True on success, False if you need to try again.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_transaction_end(XsHandle *self, PyObject *args, @@ -571,7 +580,7 @@ static PyObject *xspy_transaction_end(Xs return Py_False; } else { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); return NULL; } } @@ -584,7 +593,7 @@ static PyObject *xspy_transaction_end(Xs " port [int] : port the domain is using for xenstore\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_introduce_domain(XsHandle *self, PyObject *args) @@ -615,7 +624,7 @@ static PyObject *xspy_introduce_domain(X " dom [int]: domain id\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_release_domain(XsHandle *self, PyObject *args) @@ -642,7 +651,7 @@ static PyObject *xspy_release_domain(XsH "Close the connection to xenstore.\n" \ "\n" \ "Returns None on success.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_close(XsHandle *self) @@ -671,7 +680,7 @@ static PyObject *xspy_close(XsHandle *se " domid [int]: domain id\n" \ "\n" \ "Returns: [string] domain store path.\n" \ - "Raises RuntimeError on error.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ "\n" static PyObject *xspy_get_domain_path(XsHandle *self, PyObject *args) @@ -753,7 +762,7 @@ static PyObject *none(bool result) return Py_None; } else { - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); return NULL; } } @@ -829,7 +838,7 @@ xshandle_init(XsHandle *self, PyObject * return 0; fail: - PyErr_SetFromErrno(PyExc_RuntimeError); + PyErr_SetFromErrno(xs_error); return -1; } @@ -901,8 +910,13 @@ PyMODINIT_FUNC initxs(void) if (m == NULL) return; + xs_error = PyErr_NewException(PKG ".Error", PyExc_RuntimeError, NULL); + Py_INCREF(&xshandle_type); PyModule_AddObject(m, CLS, (PyObject *)&xshandle_type); + + Py_INCREF(xs_error); + PyModule_AddObject(m, "Error", xs_error); } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |