Inexplicable Parameter-Passing Phenomena w/MinGW GCJ

Mohan Embar gnustuff@thisiscool.com
Wed Sep 10 07:06:00 GMT 2003


Hi People,
I'm slowly losing my mind, so I'm going to babble
incoherently before going to bed.
I am further testing Michael's networking patch
which no one has approved yet and which seems okay
to me:
http://gcc.gnu.org/ml/java-patches/2003-q3/msg00535.html
Through some strange phenomenon which appears to
have nothing to do with the patch, gnu.java.net.DatagramSocket
has this call in setSoTimeout():
---------------------------------------8<----------------------------------
 public synchronized void setSoTimeout(int timeout) throws SocketException
 {
 if (timeout < 0)
 throw new IllegalArgumentException("Invalid timeout: " + timeout);
 impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
 }
---------------------------------------8<----------------------------------
...where impl.setOption is a CNI-native method in natPlainDatagramSocketImplWin32.cc:
which I've enhanced with MessageBox statements which should serve as breadcrumbs
which follow my downward spiral towards insanity:
---------------------------------------8<----------------------------------
gnu::java::net::PlainDatagramSocketImpl::setOption (jint optID,
					 ::java::lang::Object *value)
{
 int val = 0;
 socklen_t val_len = sizeof (val);
 
 MessageBox(NULL, "setOption", "We are here.", MB_OK);
 if (fnum < 0)
 throw new ::java::net::SocketException (JvNewStringUTF ("Socket closed"));
 if (_Jv_IsInstanceOf (value, &::java::lang::Boolean::class$))
 {
 MessageBox(NULL, "setOption", "1111", MB_OK);
 ::java::lang::Boolean *boolobj = 
 static_cast< ::java::lang::Boolean *> (value);
 val = boolobj->booleanValue() ? 1 : 0;
 }
 else if (_Jv_IsInstanceOf (value, &::java::lang::Integer::class$))
 {
 MessageBox(NULL, "setOption", "2222", MB_OK);
 ::java::lang::Integer *intobj = 
 static_cast< ::java::lang::Integer *> (value); 
 val = (int) intobj->intValue();
 }
 else
 {
 MessageBox(NULL, "setOption", "3333", MB_OK);
	}
 // Else assume value to be an InetAddress for use with IP_MULTICAST_IF.
 
 MessageBox(NULL, "setOption", "4444", MB_OK);
 fflush(stdout);
---------------------------------------8<----------------------------------
Here is the call in my test program which calls DatagramSocket.setOption():
---------------------------------------8<----------------------------------
 if (m_nTimeoutMSecs > 0)
 {
 System.out.println("Setting timeout to "+m_nTimeoutMSecs);
 skt.setSoTimeout(m_nTimeoutMSecs);
 System.out.println("Timeout: "+skt.getSoTimeout());
 }
---------------------------------------8<----------------------------------
When the above skt.getSoTimeout() call is uncommented, the MessageBoxes appear,
but I get a "3333", which means that new Integer(timeout) in DatagramSocket
was not identified as either a java.lang.Boolean or a java.lang.Integer
in natPlainDatagramSocketImplWin32.cc/setOption(). (At one point in time,
I printed value->getClass()->getName() and I got "java.lang.Class".)
When the above skt.getTimeout() call (which happens AFTER the skt.setSoTimeout()
call and should therefore have no effect on it) is commented out, no
message boxes appear.
I know I need to troubleshoot this and document this much further, but what
I'm looking for is any sort of "aha" here. Keep in mind that this is a
statically linked libgcj.
-- Mohan
http://www.thisiscool.com/
http://www.animalsong.org/


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /