From patchwork Thu Sep 21 16:47:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Euan Harris X-Patchwork-Id: 9964287 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 476CF602D8 for ; Thu, 21 Sep 2017 16:49:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3B3E4295FF for ; Thu, 21 Sep 2017 16:49:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2EC5F2956F; Thu, 21 Sep 2017 16:49:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A90DC2956F for ; Thu, 21 Sep 2017 16:49:41 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dv4dI-0001i6-8v; Thu, 21 Sep 2017 16:47:24 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dv4dG-0001hJ-OF for xen-devel@lists.xenproject.org; Thu, 21 Sep 2017 16:47:22 +0000 Received: from [85.158.137.68] by server-11.bemta-3.messagelabs.com id F2/F4-01812-91DE3C95; Thu, 21 Sep 2017 16:47:21 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprGIsWRWlGSWpSXmKPExsXitHRDpK7E28O RBldXyVh83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBlntxxiLFgjVbFswSTWBsb5Il2MnBwSAv4S q/6cZwSx2QS0JHZ/WMjexcjBISKgInF7rwFImFnAW2Ll9OOsILawQKxE/4W1TCA2i4CqxIpNz 8DivAJuElevTWaGGKkgMeXhezCbU8Bd4vGszWC2EFDNrL3drBC2ssSHK2vYIXoFJU7OfMICsU tC4uCLF8wTGHlnIUnNQpJawMi0ilGjOLWoLLVI19BSL6koMz2jJDcxM0fX0MBYLze1uDgxPTU nMalYLzk/dxMjMHTqGRgYdzD+Pu53iFGSg0lJlPfA08ORQnxJ+SmVGYnFGfFFpTmpxYcYZTg4 lCR4c18D5QSLUtNTK9Iyc4BBDJOW4OBREuHtB0nzFhck5hZnpkOkTjEacxzbdPkPE0fHzbt/m IRY8vLzUqXEecNASgVASjNK8+AGwaLrEqOslDAvIwMDgxBPQWpRbmYJqvwrRnEORiVh3gMgU3 gy80rg9r0COoUJ6JTsDQdATilJREhJNTDKS5r9P2NrtmKR1N8SN5dbUenHLv8ULF3FdKPsrtG Wh9tbwv9r8LwQYliapS9aGff/u8Uz89SDt2dYJnKJ3n2q+Pj++/W9b5ZznUqQOppwrfNWdBqr cJpJiv8TplVKSzkPbN9mPHfel++bXig9Y9cI1mVev8D0jWiArPbPU5qqa4znnnqmIHBHiaU4I 9FQi7moOBEAD5cVjKkCAAA= X-Env-Sender: prvs=4307c781f=euan.harris@citrix.com X-Msg-Ref: server-5.tower-31.messagelabs.com!1506012438!112694314!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 64723 invoked from network); 21 Sep 2017 16:47:20 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 21 Sep 2017 16:47:20 -0000 X-IronPort-AV: E=Sophos;i="5.42,425,1500940800"; d="scan'208";a="440712465" From: Euan Harris To: Date: Thu, 21 Sep 2017 17:47:07 +0100 Message-ID: <1506012428-59769-3-git-send-email-euan.harris@citrix.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1506012428-59769-1-git-send-email-euan.harris@citrix.com> References: <1506012428-59769-1-git-send-email-euan.harris@citrix.com> MIME-Version: 1.0 Cc: Euan Harris , marmarek@invisiblethingslab.com Subject: [Xen-devel] [PATCH v2 2/3] python: Extract registered watch search logic from xspy_read_watch() X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 Reviewed-by: Wei Liu Acked-by: Marek Marczykowski-Górecki --- Changed since v1: * Remove stray newline * Fix indentation tools/python/xen/lowlevel/xs/xs.c | 60 ++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c index 9f1b916..2af5e07 100644 --- a/tools/python/xen/lowlevel/xs/xs.c +++ b/tools/python/xen/lowlevel/xs/xs.c @@ -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; - } - 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; + return val; } - /* 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) {