On Sat, Jul 08, 2006 at 03:44:55PM -0700, Scott Wang wrote:

> Thanks Paul!
> 
> (1) Yes, we do send SIGKILL (9) to kill the parent
> process even the child processes are still running and
> our purpose is to have a clean kill from "root", so,
> do you think send SIGKILL (2) will be better? or, we
> could consider to send SIGKILL (2) to kill all the
> child processes before send SIGKILL (2) to kill parent
> process, do you think this may help?
> 
> (2) "Maybe you could send it something a little nicer
> which might allow to process to clean up.", any more
> detail suggestion and example will be appreciated!

I'm not quite sure what your environment looks like, so I can only give
some general suggestions at best.

If you can avoid signals completely, I would try to do that.  Maybe you
have some other method of IPC going on that you could use to use to send
a "kill yourself" command.

Singals in perl used not to be safe, that is they could lead to
corruption or crashes.  Since 5.8 they have been safe (providing you
haven't explicitly made them unsafe).  (Hopefully you are not using
5.6.)  So if you can send a signal which can be caught, and then set up
a signal handler which cleans up (if necessary) and then exists the
program, that should allow things to work better.  You might like to
consider USR1 or USR2 for this, if you are not already using them.  Or
you might prefer TERM.  In any case, you should ensure that it is a
signal which can be caught, which is not the case with KILL.

> (3) We might also consider to give some sleep time
> before destroy the test object, which causes process
> killing and cleaning up, but, is there a way we can
> know Devel::Cover has doen its work to write data?
> 
> (4) "Devel::Cover does its work in the very last END
> block.", does this mean that Devel::Cover will not
> write data until the main test process run to its end?

Sleeping, then killing won't work.  Although Devel::Cover collects data
the entire time a program is running (unless you turn it off at some
point), the data will not be saved until its END block is run.  This
will normally be the very last END block.  This means that unless you
let the program run to completion the coverage data will not be fully
saved.  You might hinder this process by calling _exit, calling exec,
sending SIGKILL or doing anything else that stops normal completion of
the program.

> For example, a perl test script loads the perl module
> that is under testing and excise the functions in that
> module, sometime the test script needs use "system" to
> call some other perl scripts (that also is under
> testing), Devel::Cover will not write data until the
> main test script reach its end point or exit? 

Correct.  But the scripts you are calling with system will not have any
coverage data collected unless you have arranged for that in some way.
And if you do that, the coverage data for those scripts will be written
as soon as the scripts exit.

> (5) Is there a way we can tell which data files (under
> structure folder?) have been corrupted?

Just try reading them with the retrieve method from Storable.  Better
yet, send me patches for Devel::Cover::DB::validate_db and
Devel::Cover::DB::is_valid to do something more than just check that one
file exists there ;-)  (Those methods should probably be merged too.)
(And sorry they are not already written.  I suspect something a little
more robust there might have saved you a bit of pain.)

-- 
Paul Johnson - [EMAIL PROTECTED]
http://www.pjcj.net

Reply via email to