python: Extract registered watch search logic from xspy_read_watch()

When a watch fires, xspy_read_watch() checks whether the client has
registered interest in the path which changed and, if so, returns the
path and a client-supplied token.   The binding for xs_check_watch()
needs to do the same, so this patch extracts the search code into a
separate function.

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>
This commit is contained in:
Euan Harris authored and Wei Liu committed 2017-09-25 14:35:56 +01:00
1 parent 43fd62ce16
commit f6e1023412
1 file changed
+37 -23
+37 -23
View File
@@ -77,6 +77,8 @@ static inline struct xs_handle *xshandle(XsHandle *self)
static void remove_watch(XsHandle *xsh, PyObject *token);
static PyObject *match_watch_by_token(XsHandle *self, char **xsval);
static PyObject *none(bool result);
static int parse_transaction_path(XsHandle *self, PyObject *args,
@@ -484,8 +486,6 @@ static PyObject *xspy_read_watch(XsHandle *self, PyObject *args)
struct xs_handle *xh = xshandle(self);
PyObject *val = NULL;
char **xsval;
PyObject *token;
int i;
unsigned int num;
if (!xh)
@@ -497,29 +497,16 @@ again:
Py_END_ALLOW_THREADS
if (!xsval) {
PyErr_SetFromErrno(xs_error);
goto exit;
return val;
}
if (sscanf(xsval[XS_WATCH_TOKEN], "%li", (unsigned long *)&token) != 1) {
xs_set_error(EINVAL);
goto exit;
}
for (i = 0; i < PyList_Size(self->watches); i++) {
if (token == PyList_GetItem(self->watches, i))
break;
}
if (i == PyList_Size(self->watches)) {
/* We do not have a registered watch for the one that has just fired.
Ignore this -- a watch that has been recently deregistered can still
have watches in transit. This is a blocking method, so go back to
read again.
*/
free(xsval);
goto again;
}
/* Create tuple (path, token). */
val = Py_BuildValue("(sO)", xsval[XS_WATCH_PATH], token);
exit:
val = match_watch_by_token(self, xsval);
free(xsval);
if (!val && errno == EAGAIN) {
goto again;
}
return val;
}
@@ -868,6 +855,33 @@ static int parse_transaction_path(XsHandle *self, PyObject *args,
}
static PyObject *match_watch_by_token(XsHandle *self, char **xsval)
{
PyObject *token;
int i;
if (sscanf(xsval[XS_WATCH_TOKEN], "%li", (unsigned long *)&token) != 1) {
xs_set_error(EINVAL);
return NULL;
}
for (i = 0; i < PyList_Size(self->watches); i++) {
if (token == PyList_GetItem(self->watches, i))
break;
}
if (i == PyList_Size(self->watches)) {
/* We do not have a registered watch for the one that has just fired.
Ignore this -- a watch that has been recently deregistered can still
have watches in transit.
*/
xs_set_error(EAGAIN);
return NULL;
}
/* Create tuple (path, token). */
return Py_BuildValue("(sO)", xsval[XS_WATCH_PATH], token);
}
static PyObject *none(bool result)
{
if (result) {
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.