May be there is a difficulty with free_all_bufs() ?
If i understand well the foreach() function :
Pre process part :
=============
/*
* Filter out any command/option issues.
*/
if (CRASHDEBUG(1)) {
...
case FOREACH_SIG:
if (fd->flags & (FOREACH_l_FLAG|FOREACH_s_FLAG)) {
error(FATAL,
"sig: -l and -s options are not
applicable\n");
}
if (fd->flags & FOREACH_g_FLAG)
hash_tgid=alloc_hash_tgid();
/* Allocation with GETBUF() : hash table initialized*/
break;
...
tc = FIRST_CONTEXT();
Process part :
==========
for (i = 0; i < RUNNING_TASKS(); i++, tc++) {
doit = FALSE;
...
for (k = 0; k < fd->keys; k++) {
free_all_bufs();
/* All buffers allocated via GETBUF() are killed ? */
...
case FOREACH_SIG:
pc->curcmd = "sig";
if (fd->flags & FOREACH_g_FLAG) {
tgid = task_tgid(tc->task);
if (put_tgid(hash_tgid,tgid))
/* More allocations with GETBUF() : nodes added to hash table */
show_tgid_sig_list(tc->task);
} else {
do_sig(tc->task, FOREACH_SIG,
fd->reference ? ref : NULL);
}
break;
...
Post process part
============
...
case FOREACH_SIG:
if (CRASHDEBUG(1))
list_hash_tgid(hash_tgid);
if (fd->flags & FOREACH_g_FLAG) {
pc->curcmd = "sig";
free_hash_tgid(hash_tgid); /*
FREEBUF() used to release hash table */
}
break;
....
By the way, a third cleaner version of sig -g and foreach sig -g ... in
attached file.
----- Original Message -----
From: "Dave Anderson" <anderson(a)redhat.com>
To: "Discussion list for crash utility usage, maintenance and development"
<crash-utility(a)redhat.com>
Sent: Tuesday, October 10, 2006 3:07 PM
Subject: Re: [Crash-utility] sig -g and foreach sig -g
Olivier Daudel wrote:
Hello Dave,
I think sig -g is quite OK.
I have a problem with foreach sig -g.
If i use malloc() and free(), it seems to work (may be the algorithmic is
OK).
I have tryed to use hashing on tgid to control if we have already
displayed
it.
If i use GETBUF() and FREEBUF(), it crashes.
May be i don't understant some conditions in using GETBUF() and FREEBUF()
?
Thanks for any suggestion.
Hi Olivier,
Thanks for the update -- I'll take a look at the patch.
I don't understand off-hand why it would crash with GETBUF()/FREEBUF().
Using malloc/free for temporary buffers has always been a potential
problem because the command can be interrupted mid-stream, and
when that happens, it longjmp()'s back to the main loop, and the memory
is leaked.
GETBUF() is preferred over the malloc() of temporary per-command buffers
because even if you forget to do the FREEBUF(), it will be called
automatically
prior to the next command. In other words, the buffer returned from any
GETBUF() call can only be used for a single command, because the
buffer(s) will be subsequently freed in restore_sanity(), which is executed
just prior to the next command line being accessed.
Anyway, I'll take in your sig command changes, and see what I can do
about the foreach part.
Thanks again,
Dave
------------------------------------------------------------------------------------------------------------------------
Name: sig.patch
sig.patch Type: unspecified type (application/octet-stream)
Encoding: quoted-printable
------------------------------------------------------------------------------------------------------------------------
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility