]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
python: Add binding for non-blocking xs_check_watch()
authorEuan Harris <euan.harris@citrix.com>
Fri, 22 Sep 2017 16:21:14 +0000 (17:21 +0100)
committerWei Liu <wei.liu2@citrix.com>
Mon, 25 Sep 2017 13:36:00 +0000 (14:36 +0100)
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 <euan.harris@citrix.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
tools/python/xen/lowlevel/xs/xs.c

index e7c3bd06cc2848621dd318cb3af7a65e97b7444a..9a0acfc25c6f277c21e206f33db143bbfe9c9c8b 100644 (file)
@@ -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),