diff mbox

[2/2] qtest: fix a "!chr->fd_in_tag" assertion error in qtest.

Message ID 1393237002-16980-3-git-send-email-ghammer@redhat.com
State New
Headers show

Commit Message

Gal Hammer Feb. 24, 2014, 10:16 a.m. UTC
Replacement of the default chardev handlers now requires a call to
release the current handlers.

Signed-off-by: Gal Hammer <ghammer@redhat.com>
---
 monitor.c | 1 +
 qtest.c   | 2 ++
 2 files changed, 3 insertions(+)

Comments

Paolo Bonzini Feb. 24, 2014, 10:32 a.m. UTC | #1
Il 24/02/2014 11:16, Gal Hammer ha scritto:
> Replacement of the default chardev handlers now requires a call to
> release the current handlers.
>
> Signed-off-by: Gal Hammer <ghammer@redhat.com>
> ---
>  monitor.c | 1 +
>  qtest.c   | 2 ++
>  2 files changed, 3 insertions(+)
>
> diff --git a/monitor.c b/monitor.c
> index de90fba..db52e7f 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -5024,6 +5024,7 @@ void monitor_init(CharDriverState *chr, int flags)
>      if (monitor_ctrl_mode(mon)) {
>          mon->mc = g_malloc0(sizeof(MonitorControl));
>          /* Control mode requires special handlers */
> +        qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>          qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
>                                monitor_control_event, mon);
>          qemu_chr_fe_set_echo(chr, true);
> diff --git a/qtest.c b/qtest.c
> index ae941d6..a5682ee 100644
> --- a/qtest.c
> +++ b/qtest.c
> @@ -519,6 +519,8 @@ void qtest_init(const char *qtest_chrdev, const char *qtest_log, Error **errp)
>          return;
>      }
>
> +    /* Replace the default tcp's handlers with qtest's handlers. */
> +    qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>      qemu_chr_add_handlers(chr, qtest_can_read, qtest_read, qtest_event, chr);
>      qemu_chr_fe_set_echo(chr, true);
>
>

Why can't qemu_chr_add_handlers call remove_fd_in_watch when handlers 
are replaced, before setting the new ones?

Paolo
Gal Hammer Feb. 24, 2014, 11:44 a.m. UTC | #2
On 24/02/2014 12:32, Paolo Bonzini wrote:
> Il 24/02/2014 11:16, Gal Hammer ha scritto:
>> Replacement of the default chardev handlers now requires a call to
>> release the current handlers.
>>
>> Signed-off-by: Gal Hammer <ghammer@redhat.com>
>> ---
>>  monitor.c | 1 +
>>  qtest.c   | 2 ++
>>  2 files changed, 3 insertions(+)
>>
>> diff --git a/monitor.c b/monitor.c
>> index de90fba..db52e7f 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -5024,6 +5024,7 @@ void monitor_init(CharDriverState *chr, int flags)
>>      if (monitor_ctrl_mode(mon)) {
>>          mon->mc = g_malloc0(sizeof(MonitorControl));
>>          /* Control mode requires special handlers */
>> +        qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>>          qemu_chr_add_handlers(chr, monitor_can_read,
>> monitor_control_read,
>>                                monitor_control_event, mon);
>>          qemu_chr_fe_set_echo(chr, true);
>> diff --git a/qtest.c b/qtest.c
>> index ae941d6..a5682ee 100644
>> --- a/qtest.c
>> +++ b/qtest.c
>> @@ -519,6 +519,8 @@ void qtest_init(const char *qtest_chrdev, const
>> char *qtest_log, Error **errp)
>>          return;
>>      }
>>
>> +    /* Replace the default tcp's handlers with qtest's handlers. */
>> +    qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>>      qemu_chr_add_handlers(chr, qtest_can_read, qtest_read,
>> qtest_event, chr);
>>      qemu_chr_fe_set_echo(chr, true);
>>
>>
>
> Why can't qemu_chr_add_handlers call remove_fd_in_watch when handlers
> are replaced, before setting the new ones?
>
> Paolo

It used to be like that (see patch 1/2 for the change). However, I 
removed it after I saw that the function remove_fd_in_watch() is always 
called when setting all the handlers to NULL (qemu-char.c +3872) so a 
second call in every chr_update_read_handler callback seems redundant.

As far as I can tell only the qtest change the read handlers and not 
using the default ones.

     Gal.
Gal Hammer Feb. 25, 2014, 10:18 a.m. UTC | #3
Hi,

After reading the code again. It make sense to leave the call to remove_fd_in_watch() because I changed the code so the chr_update_read_handler function is called only when the front end is opened.

Submitting a new version of the patch.

    Gal.


----- Original Message -----
From: "Gal Hammer" <ghammer@redhat.com>
To: "Paolo Bonzini" <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: "amit shah" <amit.shah@redhat.com>, "peter maydell" <peter.maydell@linaro.org>, anthony@codemonkey.ws
Sent: Monday, February 24, 2014 1:44:31 PM
Subject: Re: [Qemu-devel] [PATCH 2/2] qtest: fix a "!chr->fd_in_tag" assertion error in qtest.

On 24/02/2014 12:32, Paolo Bonzini wrote:
> Il 24/02/2014 11:16, Gal Hammer ha scritto:
>> Replacement of the default chardev handlers now requires a call to
>> release the current handlers.
>>
>> Signed-off-by: Gal Hammer <ghammer@redhat.com>
>> ---
>>  monitor.c | 1 +
>>  qtest.c   | 2 ++
>>  2 files changed, 3 insertions(+)
>>
>> diff --git a/monitor.c b/monitor.c
>> index de90fba..db52e7f 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -5024,6 +5024,7 @@ void monitor_init(CharDriverState *chr, int flags)
>>      if (monitor_ctrl_mode(mon)) {
>>          mon->mc = g_malloc0(sizeof(MonitorControl));
>>          /* Control mode requires special handlers */
>> +        qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>>          qemu_chr_add_handlers(chr, monitor_can_read,
>> monitor_control_read,
>>                                monitor_control_event, mon);
>>          qemu_chr_fe_set_echo(chr, true);
>> diff --git a/qtest.c b/qtest.c
>> index ae941d6..a5682ee 100644
>> --- a/qtest.c
>> +++ b/qtest.c
>> @@ -519,6 +519,8 @@ void qtest_init(const char *qtest_chrdev, const
>> char *qtest_log, Error **errp)
>>          return;
>>      }
>>
>> +    /* Replace the default tcp's handlers with qtest's handlers. */
>> +    qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
>>      qemu_chr_add_handlers(chr, qtest_can_read, qtest_read,
>> qtest_event, chr);
>>      qemu_chr_fe_set_echo(chr, true);
>>
>>
>
> Why can't qemu_chr_add_handlers call remove_fd_in_watch when handlers
> are replaced, before setting the new ones?
>
> Paolo

It used to be like that (see patch 1/2 for the change). However, I 
removed it after I saw that the function remove_fd_in_watch() is always 
called when setting all the handlers to NULL (qemu-char.c +3872) so a 
second call in every chr_update_read_handler callback seems redundant.

As far as I can tell only the qtest change the read handlers and not 
using the default ones.

     Gal.
diff mbox

Patch

diff --git a/monitor.c b/monitor.c
index de90fba..db52e7f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -5024,6 +5024,7 @@  void monitor_init(CharDriverState *chr, int flags)
     if (monitor_ctrl_mode(mon)) {
         mon->mc = g_malloc0(sizeof(MonitorControl));
         /* Control mode requires special handlers */
+        qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
         qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
                               monitor_control_event, mon);
         qemu_chr_fe_set_echo(chr, true);
diff --git a/qtest.c b/qtest.c
index ae941d6..a5682ee 100644
--- a/qtest.c
+++ b/qtest.c
@@ -519,6 +519,8 @@  void qtest_init(const char *qtest_chrdev, const char *qtest_log, Error **errp)
         return;
     }
 
+    /* Replace the default tcp's handlers with qtest's handlers. */
+    qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL);
     qemu_chr_add_handlers(chr, qtest_can_read, qtest_read, qtest_event, chr);
     qemu_chr_fe_set_echo(chr, true);