NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-xen/47193: xenwatch handlers are added twice to the list of pending watches
The following reply was made to PR port-xen/47193; it has been noted by GNATS.
From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= <roger.pau%citrix.com@localhost>
To: Manuel Bouyer <bouyer%antioche.eu.org@localhost>
Cc: Cherry G.Mathew <cherry%zyx.in@localhost>, "gnats-bugs%NetBSD.org@localhost"
<gnats-bugs%NetBSD.org@localhost>,
"port-xen-maintainer%netbsd.org@localhost"
<port-xen-maintainer%NetBSD.org@localhost>,
"netbsd-bugs%netbsd.org@localhost"
<netbsd-bugs%NetBSD.org@localhost>
Subject: Re: port-xen/47193: xenwatch handlers are added twice to the list
of pending watches
Date: Tue, 20 Nov 2012 10:26:29 +0100
On 19/11/12 20:28, Manuel Bouyer wrote:
> On Mon, Nov 19, 2012 at 07:49:44PM +0100, Roger Pau Monné wrote:
>>> I don't know why gcc doesn't complain about repeated being possibly
>>> uninitialised here. AFAIK repeated is initialised only in the found case.
>>> repeated = false should probably be moved upper.
>>
>> I guess because if "repeated" is not initialized, it is not even
>> checked, since the first part of the if condition "if (!found)" will
>> always be true.
>
> Right. But I guess the waring would trip with different optimisation
> options.
Thanks for the review and please take a look at the following patch:
---
diff --git a/sys/arch/xen/xenbus/xenbus_xs.c b/sys/arch/xen/xenbus/xenbus_xs.c
index c09e7c4..589e7e1 100644
--- a/sys/arch/xen/xenbus/xenbus_xs.c
+++ b/sys/arch/xen/xenbus/xenbus_xs.c
@@ -751,7 +751,7 @@ xenwatch_thread(void *unused)
static int
process_msg(void)
{
- struct xs_stored_msg *msg;
+ struct xs_stored_msg *msg, *s_msg;
char *body;
int err;
@@ -782,7 +782,7 @@ process_msg(void)
body[msg->hdr.len] = '\0';
if (msg->hdr.type == XS_WATCH_EVENT) {
- bool found;
+ bool found, repeated;
DPRINTK("process_msg: XS_WATCH_EVENT");
msg->u.watch.vec = split(body, msg->hdr.len,
@@ -796,14 +796,24 @@ process_msg(void)
msg->u.watch.handle = find_watch(
msg->u.watch.vec[XS_WATCH_TOKEN]);
found = (msg->u.watch.handle != NULL);
+ repeated = false;
if (found) {
mutex_enter(&watch_events_lock);
- SIMPLEQ_INSERT_TAIL(&watch_events, msg, msg_next);
- cv_broadcast(&watch_cv);
+ /* Don't add duplicate events to the queue of pending
watches */
+ SIMPLEQ_FOREACH(s_msg, &watch_events, msg_next) {
+ if (s_msg->u.watch.handle ==
msg->u.watch.handle) {
+ repeated = true;
+ break;
+ }
+ }
+ if (!repeated) {
+ SIMPLEQ_INSERT_TAIL(&watch_events, msg,
msg_next);
+ cv_broadcast(&watch_cv);
+ }
mutex_exit(&watch_events_lock);
}
mutex_exit(&watches_lock);
- if (!found) {
+ if (!found || repeated) {
free(msg->u.watch.vec, M_DEVBUF);
free(msg, M_DEVBUF);
}
Home |
Main Index |
Thread Index |
Old Index