The simplest command line piping in a threaded build of bleadperl on
VMS now gives the following errors:

$ perl  -e "print 'ok';" | exit
panic: free from wrong pool.
panic: free from wrong pool during global destruction.
%C-F-EBADF, bad file number


I'm not sure where the bad file number comes from, but what's
happening with the pool messages is that Perl_safesysfree in util.c
has some new code that checks to see if we are deallocating memory
from the same thread in which we allocated it (or, more properly,
from within the same Perl interpreter context), and it yelps if not.

On VMS, command-line piping is implemented by Perl itself, and such a
pipe is opened at startup time before any thread context has been
initialized.  We are using Newx() to allocate memory for the
structures used by our homegrown pipe implementation and Safefree()
to deallocate them, but this gets us in trouble because for a
command-line pipe we allocate before there is any thread context
(my_perl == NULL) and deallocate after.  Even if there is only ever
one interpreter in the process, it looks like we are allocating and
deallocating from different interpreters.

There are some pipe structures that are clearly intended to be
process-wide, shared by all pipes regardless of what thread they're
in.  I see no harm in simply using malloc() and free() for these and
side-stepping the interpreter context issue.

But there are other structures that are pipe-specific, and it seems
like a good idea to keep the new sanity check that ensures we close a
pipe and deallocate its structures from within the same interpreter
context where it was opened. But I haven't thought of a good way to
do that for the case where the pipe is opened when there is no
context at all yet.  Any suggestions?

--
________________________________________
Craig A. Berry
mailto:[EMAIL PROTECTED]

"... getting out of a sonnet is much more
 difficult than getting in."
                 Brad Leithauser

Reply via email to