From: Simon Marchi <simark@simark.ca>
To: "Maciej W. Rozycki" <macro@wdc.com>
Cc: Pedro Alves <palves@redhat.com>,
gdb-patches@sourceware.org, Jim Wilson <jimw@sifive.com>
Subject: Re: [PATCH v2 2/4] Unregister the last inferior from the event loop
Date: Tue, 21 Jan 2020 17:34:00 -0000 [thread overview]
Message-ID: <323e416c-f0a9-ec14-c279-508c0245a479@simark.ca> (raw)
In-Reply-To: <alpine.LFD.2.21.2001210747120.15714@redsun52.ssa.fujisawa.hgst.com>
On 2020-01-21 3:29 a.m., Maciej W. Rozycki wrote:
> Hi Simon,
>
>>> This is because `remote_target::resume' enables the asynchronous event
>>> loop, as indicated by the first `infrun: infrun_async(1)' record above,
>>> and then the confirmation dialogue temporarily disables it and then
>>> reenables, as indicated by the second `infrun: infrun_async(1)' record
>>> above. The problem with that approach is that the reenabling also marks
>>> the handler for the `infrun_async_inferior_event_token' event ready,
>>> even though it was not before the temporary disabling, by calling
>>> `mark_async_event_handler' on it, and that triggers the infinite loop as
>>> there's no inferior anymore and consequently no event waiting that would
>>> stop it.
>>
>> I don't understand this description. Let's assume that the second call to
>> infrun_async indeed left infrun_async_inferior_event_token.ready to true.
>> Then I would expect the event loop to call it once, setting the ready flag
>> to false. After that, the ready being false, I don't see why the callback
>> of infrun_async_inferior_event_token would get called in a loop.
>
> Thanks for looking into it. It's been a while however, so my memory has
> become fuzzy on this.
>
> I have therefore gone reading through the code again and what I can see
> is that in the async mode the `ready' (readiness) flag is never cleared:
> see `infrun_async' and `remote_target::async', which are the only places
> to call `clear_async_event_handler' and then only when the async mode is
> being disabled.
The ready flag is also cleared in `check_async_event_handlers`, just before
invoking the callback. So I was thinking, why would the callback get called
repeatedly if the ready flag is cleared just before it gets called, and
there's nothing setting it back to true. The answer is probably that the
busy loop is within that callback, as seen below?
> On the other hand waiting for an inferior event does get disabled in
> `handle_inferior_event' regardless of the readiness flag, by calling
> `stop_waiting', for certain events, but not for TARGET_WAITKIND_IGNORE.
> Instead for that event `prepare_to_wait' is called, which makes sense to
> me because such an event does not indicate whether waiting should or
> should not be disabled, and with an asynchronous target you can normally
> (i.e. if not indicated by a specific event received otherwise, e.g.
> TARGET_WAITKIND_EXITED) expect a further event to be received anytime.
>
> Does this clarify the problematic scenario to you?
Ok, so if I understand, the infinite loop is this one, inside wait_for_inferior?
while (1)
{
...
/* Now figure out what to do with the result of the result. */
handle_inferior_event (ecs);
if (!ecs->wait_some_more)
break;
}
After the remote target has been unpushed, the remaining target is probably
just the "exec file" target, which does not provide a ::wait implementation,
and therefore inherits default_target_wait:
ptid_t
default_target_wait (struct target_ops *ops,
ptid_t ptid, struct target_waitstatus *status,
int options)
{
status->kind = TARGET_WAITKIND_IGNORE;
return minus_one_ptid;
}
And because that returns TARGET_WAITKIND_IGNORE, which results in
ecs->wait_some_more getting set by handle_inferior_event/prepare_to_wait,
it results in the infinite loop in wait_for_inferior.
Does that look accurate?
Simon
next prev parent reply other threads:[~2020-01-21 17:11 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 20:51 [PATCH v2 0/4] GDB fixes for the remote end having gone astray Maciej W. Rozycki
2019-11-06 20:51 ` [PATCH v2 1/4] Remove stale breakpoint step-over information Maciej W. Rozycki
2020-01-21 5:41 ` Simon Marchi
2020-02-19 11:26 ` Luis Machado
2019-11-06 20:52 ` [PATCH v2 3/4] Remove breakpoint step-over information if failed to resume Maciej W. Rozycki
2020-01-21 8:29 ` Simon Marchi
2020-02-19 13:30 ` Luis Machado
2019-11-06 20:52 ` [PATCH v2 4/4] Unregister the inferior from the event loop " Maciej W. Rozycki
2020-02-19 13:40 ` Luis Machado
2019-11-06 20:52 ` [PATCH v2 2/4] Unregister the last inferior from the event loop Maciej W. Rozycki
2020-01-21 5:47 ` Simon Marchi
2020-01-21 11:21 ` Maciej W. Rozycki
2020-01-21 17:34 ` Simon Marchi [this message]
2020-01-22 17:35 ` Maciej W. Rozycki
2020-01-23 1:19 ` Maciej W. Rozycki
2020-01-23 5:39 ` Maciej W. Rozycki
2020-01-23 16:59 ` Simon Marchi
2019-11-18 12:38 ` [PING][PATCH v2 0/4] GDB fixes for the remote end having gone astray Maciej W. Rozycki
2019-11-26 15:49 ` [PING^2][PATCH " Maciej W. Rozycki
2019-12-02 14:50 ` [PING^3][PATCH " Maciej W. Rozycki
2019-12-05 20:59 ` Palmer Dabbelt via gdb-patches
2019-12-05 21:21 ` Maciej W. Rozycki
2019-12-09 21:29 ` [PING^4][PATCH " Maciej W. Rozycki
2019-12-17 0:06 ` [PING^5][PATCH " Maciej W. Rozycki
2020-01-06 15:40 ` [PING^6][PATCH " Maciej W. Rozycki
2020-01-13 20:46 ` [PING^7][PATCH " Maciej W. Rozycki
2020-01-21 4:21 ` [PING^8][PATCH " Maciej W. Rozycki
2020-02-10 9:01 ` [PING^10][PATCH " Maciej W. Rozycki
2020-02-17 14:07 ` [PATCH " Maciej W. Rozycki
2020-02-18 10:38 ` Luis Machado
2020-02-19 21:11 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=323e416c-f0a9-ec14-c279-508c0245a479@simark.ca \
--to=simark@simark.ca \
--cc=gdb-patches@sourceware.org \
--cc=jimw@sifive.com \
--cc=macro@wdc.com \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox