[Crash-utility] sig -g and foreach sig -g

Olivier Daudel olivier.daudel at u-paris10.fr
Tue Oct 10 14:54:07 UTC 2006


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 at redhat.com>
To: "Discussion list for crash utility usage, maintenance and development" 
<crash-utility at 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 at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility

--
Crash-utility mailing list
Crash-utility at redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sig3.patch
Type: application/octet-stream
Size: 16762 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20061010/df88606f/attachment.obj>


More information about the Crash-utility mailing list