From: Jan Kiszka <jan.kiszka@siemens.com>
To: Daniel Wagner <daniel.wagner@bmw-carit.de>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH v0] scripts/gdb: Use a generator instead of iterator for task list
Date: Thu, 16 Oct 2014 14:31:26 +0200 [thread overview]
Message-ID: <543FBA9E.6070704@siemens.com> (raw)
In-Reply-To: <1412841839-24537-2-git-send-email-daniel.wagner@bmw-carit.de>
On 2014-10-09 10:03, Daniel Wagner wrote:
> The iterator does not return any task_struct from the thread_group list
> because the first condition in the 'if not t or ...' will only be the
> first time None.
>
> Instead of keeping track of the state ourself in the next() function,
> we fall back using Python's generator.
>
> Signed-off-by: Daniel Wagner <daniel.wagner@bmw-carit.de>
> Cc: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> scripts/gdb/linux/tasks.py | 50 +++++++++++++++++++---------------------------
> 1 file changed, 20 insertions(+), 30 deletions(-)
>
> diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py
> index 0008e75..e2037d9 100644
> --- a/scripts/gdb/linux/tasks.py
> +++ b/scripts/gdb/linux/tasks.py
> @@ -18,38 +18,28 @@ from linux import utils
>
> task_type = utils.CachedType("struct task_struct")
>
> -
> -class TaskList:
> - def __init__(self):
> - global task_type
> - self.task_ptr_type = task_type.get_type().pointer()
> - self.init_task = gdb.parse_and_eval("init_task")
> - self.curr_group = self.init_task.address
> - self.curr_task = None
> -
> - def __iter__(self):
> - return self
> -
> - def __next__(self):
> - t = self.curr_task
> - if not t or t == self.curr_group:
> - self.curr_group = \
> - utils.container_of(self.curr_group['tasks']['next'],
> - self.task_ptr_type, "tasks")
> - if self.curr_group == self.init_task.address:
> - raise StopIteration
> - t = self.curr_task = self.curr_group
> - else:
> - self.curr_task = \
> - utils.container_of(t['thread_group']['next'],
> - self.task_ptr_type, "thread_group")
> - return t
> -
> - def next(self):
> - return self.__next__()
> +def task_lists():
> + global task_type
> + task_ptr_type = task_type.get_type().pointer()
> + init_task = gdb.parse_and_eval("init_task").address
> + t = g = init_task
> +
> + while True:
> + while True:
> + yield t
> +
> + t = utils.container_of(t['thread_group']['next'],
> + task_ptr_type, "thread_group")
> + if t == g:
> + break
> +
> + t = g = utils.container_of(g['tasks']['next'],
> + task_ptr_type, "tasks")
> + if t == init_task:
> + return
>
> def get_task_by_pid(pid):
> - for task in TaskList():
> + for task in task_lists():
> if int(task['pid']) == pid:
> return task
> return None
>
Thanks for the fix (and the nice simplification), added to my queue.
I'll repost the whole series ASAP.
Jan
--
Siemens AG, Corporate Technology, CT RTC ITP SES-DE
Corporate Competence Center Embedded Linux
prev parent reply other threads:[~2014-10-16 12:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-09 8:03 [PATCH v0] scripts/gdb: Use a generator instead of iterator for task list Daniel Wagner
2014-10-09 8:03 ` Daniel Wagner
2014-10-16 12:31 ` Jan Kiszka [this message]
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=543FBA9E.6070704@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=daniel.wagner@bmw-carit.de \
--cc=linux-kernel@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.