From: Euan Harris Date: Fri, 22 Sep 2017 16:21:14 +0000 (+0100) Subject: python: Add binding for non-blocking xs_check_watch() X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1336 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5fc07747d6c4a31cc800af4939d11fef6b62da46;p=xen.git python: Add binding for non-blocking xs_check_watch() xs_check_watch() checks for watch notifications without blocking. Together with the binding for xs_fileno(), this makes it possible to write event-driven clients in Python. Signed-off-by: Euan Harris Reviewed-by: Wei Liu Acked-by: Marek Marczykowski-Górecki --- diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c index e7c3bd06cc..9a0acfc25c 100644 --- a/tools/python/xen/lowlevel/xs/xs.c +++ b/tools/python/xen/lowlevel/xs/xs.c @@ -474,6 +474,33 @@ static PyObject *xspy_fileno(XsHandle *self) } +#define xspy_check_watch_doc "\n" \ + "Check for watch notifications without blocking.\n" \ + "\n" \ + "Returns: [tuple] (path, token).\n" \ + " None if no watches have fired.\n" \ + "Raises xen.lowlevel.xs.Error on error.\n" \ + "\n" + +static PyObject *xspy_check_watch(XsHandle *self, PyObject *args) +{ + struct xs_handle *xh = xshandle(self); + PyObject *val = NULL; + char **xsval; + + if (!xh) + return NULL; + + xsval = xs_check_watch(xh); + if (!xsval) { + return none(errno == EAGAIN); + } + + val = match_watch_by_token(self, xsval); + free(xsval); + return val; +} + #define xspy_read_watch_doc "\n" \ "Read a watch notification.\n" \ "\n" \ @@ -911,6 +938,7 @@ static PyMethodDef xshandle_methods[] = { XSPY_METH(set_permissions, METH_VARARGS), XSPY_METH(watch, METH_VARARGS), XSPY_METH(read_watch, METH_NOARGS), + XSPY_METH(check_watch, METH_NOARGS), XSPY_METH(unwatch, METH_VARARGS), XSPY_METH(transaction_start, METH_NOARGS), XSPY_METH(transaction_end, METH_VARARGS | METH_KEYWORDS),