[ovs-dev] [PATCH] poll-loop: Fix a bug while finding a poll node.
Ben Pfaff
blp at nicira.com
Mon Oct 5 19:58:15 UTC 2015
On Wed, Sep 30, 2015 at 02:18:47PM -0700, Gurucharan Shetty wrote:
> When a poll_node is created, it gets either a 'fd' or
> a 'wevent' (can't get both). When the poll_node is
> searched for previous creations on that 'fd' or 'wevent',
> the search criteria was wrong for Windows. In Windows,
> when a 'fd' is received in poll_create_node, we create a
> corresponding 'wevent'. So while searching for that 'fd',
> we should not look for 'wevent' in the hmap_node.
>
> Reported-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
> Signed-off-by: Gurucharan Shetty <gshetty at nicira.com>
I think that when the assertion is true (presumably always), the new and
the old 'if' conditions are equivalent. Is that right?
> ---
> lib/poll-loop.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/lib/poll-loop.c b/lib/poll-loop.c
> index 3c4b55c..60e1f6e 100644
> --- a/lib/poll-loop.c
> +++ b/lib/poll-loop.c
> @@ -57,16 +57,20 @@ struct poll_loop {
>
> static struct poll_loop *poll_loop(void);
>
> -/* Look up the node with same fd and wevent. */
> +/* Look up the node with same fd or wevent. */
> static struct poll_node *
> find_poll_node(struct poll_loop *loop, int fd, HANDLE wevent)
> {
> struct poll_node *node;
>
> + /* Both 'fd' and 'wevent' cannot be set. */
> + ovs_assert(!fd != !wevent);
> +
> HMAP_FOR_EACH_WITH_HASH (node, hmap_node,
> hash_2words(fd, (uint32_t)wevent),
> &loop->poll_nodes) {
> - if (node->pollfd.fd == fd && node->wevent == wevent) {
> + if ((fd && node->pollfd.fd == fd)
> + || (wevent && node->wevent == wevent)) {
> return node;
> }
> }
More information about the dev
mailing list