On Thu, Jun 01, 2006 at 10:31:34PM -0400, [EMAIL PROTECTED] wrote:
> > Line 185 in JVM.pm, BTW, looks like this:
> >
> >          my $pid = open3($in, $out, $err, $cmd) ;
> >
> > But it's darn near impossible to look at the open3 code and know what
> > it's doing, it's chock full of TomC DWIM magic.
> 
> Really?  I just had a look and it doesn't look too bad.  Anyway:
> 
> > open3: open(GLOB(0x1809d50), >&=8) failed: Bad file descriptor at ...
> 
> is fairly clear; 8 is not a valid file descriptor.  In JVM.pm, $err is
> always \*STDERR, $out and $in are \*STDOUT and \*STDIN respectively,
> unless they're 'new IO::File(">$dn")' where
> 
>   my $dn = Inline::Java::Portable::portable("DEV_NULL") ;
> 
> So my guess would be that Inline::Java::Portable::portable("DEV_NULL")
> might not be quite as portable as it portends.

Nope. It's /dev/null on OSX and that's fine.

Here's a ktrace of the system calls in open3 that lead to the failure:
(with PERL5OPT set to "MCarp=verbose")

open3(>&STDIN, IO::File=GLOB(0x1855518), >&STDERR, 
"/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Commands/java" 
 org.perl.inline.java.InlineJavaServer 0 localhost 17891 true false false) at 
/Users/timbo/.cpan/sources/authors/id/P/PA/PATL/Inline-Java-0.51/blib/lib/Inline/Java/JVM.pm
 line 186.

 14699 perl     CALL  dup(0x5)
 14699 perl     RET   dup 6
 14699 perl     CALL  close(0x5)
 14699 perl     RET   close 0
 14699 perl     CALL  dup2(0x6,0x5)
 14699 perl     RET   dup2 5
 14699 perl     CALL  close(0x6)
 14699 perl     RET   close 0
 14699 perl     CALL  close(0x5)
 14699 perl     RET   close 0
 14699 perl     CALL  pipe
 14699 perl     RET   pipe 5
 14699 perl     CALL  fcntl(0x5,0x3,0)
 14699 perl     RET   fcntl 0
 14699 perl     CALL  fcntl(0x6,0x3,0)
 14699 perl     RET   fcntl 1
 14699 perl     CALL  fcntl(0x5,0x2,0x1)
 14699 perl     RET   fcntl 0
 14699 perl     CALL  fcntl(0x6,0x2,0x1)
 14699 perl     RET   fcntl 0
 14699 perl     CALL  fork
 14699 perl     RET   fork 14700/0x396c
 14699 perl     CALL  close(0x6)
 14699 perl     RET   close 0
 14699 perl     CALL  close(0)
 14699 perl     RET   close 0
 14700 perl     CALL  getpid
 14700 perl     RET   getpid 14700/0x396c
 14699 perl     CALL  close(0x5)
 14699 perl     RET   close 0
 14700 perl     CALL  close(0x5)
 14700 perl     RET   close 0
 14700 perl     CALL  fcntl(0x6,0x3,0)
 14700 perl     RET   fcntl 1
 14700 perl     CALL  fstat(0x6,0x1800460)
 14700 perl     RET   fstat -1 errno 9 Bad file descriptor
 14700 perl     CALL  dup(0x6)
 14700 perl     RET   dup 5
 14700 perl     CALL  close(0x6)
 14700 perl     RET   close 0
 14700 perl     CALL  dup2(0x5,0x6)
 14700 perl     RET   dup2 6
 14700 perl     CALL  close(0x5)
 14700 perl     RET   close 0
 14699 perl     CALL  close(0x3)
 14699 perl     RET   close 0
 14699 perl     CALL  exit(0x1)
 14700 perl     CALL  close(0x6)
 14700 perl     RET   close 0
 14700 perl     CALL  write(0x2,0x1931e00,0x400)
 14700 perl     GIO   fd 2 wrote 1024 bytes
       "Can't exec JVM: open3: open(GLOB(0x180a0cc), >&=6) failed: Bad file 
descriptor at /usr/local/perl58-i/lib/5.8.6/IPC/Open3.pm line 142
                IPC::Open3::xopen('GLOB(0x180a0cc)', '>&=6') called at 
/usr/local/perl58-i/lib/5.8.6/IPC/Open3.pm line 222
                IPC::Open3::_open3('open3', 'Inline::Java::JVM', '>&STDIN', 
'IO::File=GLOB(0x1855518)', '>&STDERR', 
'"/System/Library/Frameworks/JavaVM.framework/Versions/Current...') called at 
/usr/local/perl58-i/lib/5.8.6/IPC/Open3.pm line 305
                IPC::Open3::open3('>&STDIN', 'IO::File=GLOB(0x1855518)', 
'>&STDERR', '"/System/Library/Frameworks/JavaVM.framework/Versions/Current...') 
called at 
/Users/timbo/.cpan/sources/authors/id/P/PA/PATL/Inline-Java-0.51/blib/lib/Inline/Java/JVM.pm
 line 188

It looks like the parent closed both side of the pipe and the error is
from the child. I hope this helps someone else as I don't have time to
dig deeper - my real interest lies with the JNI.

So I went back to look at my old emails and found one whre I said:

: But all is well! I've found the problem after some reading of "man ld"
: and http://developer.apple.com/technotes/tn2002/tn2071.html and filling
: in the gaps. What's needed is "-framework JavaVM" options to the linker.

And sure enough, adding -framework JavaVM to the Java/Makefile fixed it.

I've attached a patch.

Tim.
--- ./Java/Portable.pm.orig     2006-06-02 12:27:20.000000000 +0100
+++ ./Java/Portable.pm  2006-06-02 12:24:10.000000000 +0100
@@ -223,7 +223,7 @@
            J2SDK_BIN           =>  'Commands',
                DEFAULT_J2SDK_DIR   =>  
'/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK',
                # Tim Bunce:
-               OTHERLDFLAGS            =>  '',
+               OTHERLDFLAGS            =>  '-framework JavaVM',
        },
 } ;
 

Reply via email to